From 1117bde06bd128b8f0bf2923d825143ffcabf2a6 Mon Sep 17 00:00:00 2001 From: SavixDR Date: Mon, 12 Dec 2022 18:51:57 +0530 Subject: [PATCH 1/9] According to the Lab sheet I have implemented following classes. >>PersistentAccountDAO.java >>PersistentTransactionDAO.java >>PersistentExpenseManager.java Other than these 3 classes I have created a class to help manage my Database >>DatabaseHelper.java Using these classes I have changed SimpleExpenseManager to have a persistent storage. --- .../test/BuildConfig.java | 10 + .../dbs/simpleexpensemanager/BuildConfig.java | 12 ++ .../control/PersistentExpenseManager.java | 27 +++ .../data/impl/PersistentAccountDAO.java | 88 +++++++++ .../data/impl/PersistentTransactionDAO.java | 50 +++++ .../database/DatabaseHelper.java | 171 ++++++++++++++++++ .../simpleexpensemanager/ui/MainActivity.java | 13 +- 7 files changed, 370 insertions(+), 1 deletion(-) create mode 100644 app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java create mode 100644 app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java diff --git a/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java b/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java new file mode 100644 index 0000000000..5401844ed9 --- /dev/null +++ b/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java @@ -0,0 +1,10 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.test; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "lk.ac.mrt.cse.dbs.simpleexpensemanager.test"; + public static final String BUILD_TYPE = "debug"; +} diff --git a/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java b/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java new file mode 100644 index 0000000000..16e7306c69 --- /dev/null +++ b/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package lk.ac.mrt.cse.dbs.simpleexpensemanager; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "lk.ac.mrt.cse.dbs.simpleexpensemanager"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java new file mode 100644 index 0000000000..8073f763d8 --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java @@ -0,0 +1,27 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.control; + +import android.content.Context; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentAccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentTransactionDAO; + +public class PersistentExpenseManager extends ExpenseManager{ + private Context context; + + public PersistentExpenseManager(Context context) throws ExpenseManagerException { + this.context = context; + setup(); + } + @Override + public void setup() { + TransactionDAO persistentTransactionDAO = new PersistentTransactionDAO(context); + setTransactionsDAO(persistentTransactionDAO); + + AccountDAO persistentAccountDAO = new PersistentAccountDAO(context); + setAccountsDAO(persistentAccountDAO); + + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java new file mode 100644 index 0000000000..e3a227b1ba --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java @@ -0,0 +1,88 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.exception.InvalidAccountException; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.database.DatabaseHelper; + +public class PersistentAccountDAO implements AccountDAO { + private static Map accounts; + private DatabaseHelper dbHelper; + private Context context; + + public PersistentAccountDAO(Context context){ + this.accounts = new HashMap<>(); + this.context = context; + this.dbHelper = new DatabaseHelper(context); + + // To add the current database into the Map + currentAccountDatabase(dbHelper.getAccounts()); + } + + @Override + public List getAccountNumbersList() { + return new ArrayList<>(accounts.keySet()); + } + + + @Override + public List getAccountsList() { + return new ArrayList<>(accounts.values()); + } + + @Override + public Account getAccount(String accountNo) throws InvalidAccountException { + if (accounts.containsKey(accountNo)){ + return accounts.get(accountNo); + } + throw new InvalidAccountException("Account"+accountNo+"is not in the Database"); + } + + @Override + public void addAccount(Account account) { + if (!accounts.containsKey(account.getAccountNo())) { + dbHelper.addAccount(account); + accounts.put(account.getAccountNo(), account); + } + } + + @Override + public void removeAccount(String accountNo) throws InvalidAccountException { + if (accounts.containsKey(accountNo)){ + accounts.remove(accountNo); + dbHelper.deleteAccount(accountNo); + } + } + + @Override + public void updateBalance(String accountNo, ExpenseType expenseType, double amount) throws InvalidAccountException { + if (!accounts.containsKey(accountNo)){ + String ExceptionMsg = "Account"+accountNo+"is invalid."; + throw new InvalidAccountException(ExceptionMsg); + } + Account account = getAccount(accountNo); + switch (expenseType) { + case INCOME: + account.setBalance(account.getBalance() + amount); + break; + case EXPENSE: + account.setBalance(account.getBalance() - amount); + break; + } + dbHelper.updateAccount(account); + accounts.put(accountNo,account); + } + public void currentAccountDatabase(List AccountList){ + for (Account account:AccountList){ + accounts.put(account.getAccountNo(),account); + } + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java new file mode 100644 index 0000000000..534524f33f --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java @@ -0,0 +1,50 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.database.DatabaseHelper; + +public class PersistentTransactionDAO implements TransactionDAO { + private DatabaseHelper dbHelper; + private static Map transactionMap ; + private Context context; + + public PersistentTransactionDAO(Context context){ + context = this.context; + dbHelper = new DatabaseHelper(context); + transactionMap = dbHelper.getTransactions(); + } + + @Override + public void logTransaction(Date date, String accountNo, ExpenseType expenseType, double amount) { + Transaction transaction = new Transaction(date, accountNo, expenseType, amount); + dbHelper.addTransactions(transaction); + transactionMap = dbHelper.getTransactions(); + } + + @Override + public List getAllTransactionLogs() { + return (List) transactionMap.values(); +// return new ArrayList<>(transactionMap.values()); + } + + @Override + public List getPaginatedTransactionLogs(int limit) { + List transactions = (List) transactionMap.values(); + int size = transactions.size(); + if (size <= limit) { + return transactions; + } + // return the last limit number of transaction logs + return transactions.subList(size - limit, size); + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java new file mode 100644 index 0000000000..486d7d302f --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java @@ -0,0 +1,171 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.support.annotation.Nullable; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; + +public class DatabaseHelper extends SQLiteOpenHelper { + + private static final int Version = 1; + public static final String DBname = "Accounts Database"; + public static final String Table_Name0 = "Accounts" ; + public static final String Table_Name1 = "Transactions" ; + private static final String ACCOUNT_NUMBER = "Account_Number"; + private static final String BALANCE = "Balance"; + private static final String BANK_NAME ="Bank_Name" ; + private static final String ACCOUNT_HOLDER_NAME = "Account_Holder_Name"; + private static final String DATE = "Date"; + private static final String EXPENSE_TYPE = "Transaction_Type"; + private static final String AMOUNT = "Amount"; + private static final String ID = "ID"; + + public DatabaseHelper(@Nullable Context context) { + super(context, DBname, null , Version); + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + String TABLE_CREATE_QUERY_accounts = "CREATE TABLE "+Table_Name0+" "+ + "(" + +ACCOUNT_NUMBER+" TEXT PRIMARY KEY, " + +BANK_NAME+ " TEXT," + +ACCOUNT_HOLDER_NAME+" TEXT," + +BALANCE+" REAL" + + ");"; + /* CREATE TABLE Accounts (Account Number INTEGER PRIMARY KEY, Bank_Name TEXT, Account_Holder_Name TEXT,Balance REAL); */ + + String TABLE_CREATE_QUERY_transactions = "CREATE TABLE "+Table_Name1+" "+ + "(" + +ID+ "INTEGER PRIMARY KEY AUTOINCREMENT, " + +DATE+"TEXT, " + +ACCOUNT_NUMBER+"INTEGER PRIMARY KEY, " + +EXPENSE_TYPE+"TEXT, " + +AMOUNT+"REAL" + +");"; + + sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_accounts); + sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_transactions); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { + String DROP_TABLE_QUERY_accounts = "DROP TABLE IF EXISTS "+Table_Name0; + String DROP_TABLE_QUERY_transactions = "DROP TABLE IF EXISTS "+Table_Name1; + + sqLiteDatabase.execSQL(DROP_TABLE_QUERY_accounts); + sqLiteDatabase.execSQL(DROP_TABLE_QUERY_transactions); + + onCreate(sqLiteDatabase); + } + public void addAccount(Account account){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + + contentValues.put(ACCOUNT_NUMBER,account.getAccountNo()); + contentValues.put(BANK_NAME,account.getBankName()); + contentValues.put(ACCOUNT_HOLDER_NAME,account.getAccountHolderName()); + contentValues.put(BALANCE,account.getBalance()); + + sqLiteDatabase.insert(Table_Name0,null,contentValues); + + sqLiteDatabase.close(); + } + + public List getAccounts(){ + List AccountsList = new ArrayList<>(); + SQLiteDatabase sqLiteDatabase = getReadableDatabase(); + String query = "SELECT* FROM "+Table_Name0; + Cursor cursor = sqLiteDatabase.rawQuery(query,null); + if(cursor.moveToFirst()){ + do{ + String accountNo = cursor.getString(0); + String bankName = cursor.getString(1); + String accountHolderName = cursor.getString(2); + Double balance = cursor.getDouble(3); + + Account account = new Account(accountNo,bankName,accountHolderName,balance); + AccountsList.add(account); + + }while(cursor.moveToNext()); + } + return AccountsList; + } + + public void addTransactions(Transaction transaction){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + + contentValues.put(DATE,transaction.getDate().toString()); + contentValues.put(ACCOUNT_NUMBER,transaction.getAccountNo()); + contentValues.put(EXPENSE_TYPE,transaction.getExpenseType().toString()); + contentValues.put(AMOUNT,transaction.getAmount()); + + sqLiteDatabase.insert(Table_Name1,null,contentValues); + sqLiteDatabase.close(); + } + + public Map getTransactions(){ + Map TransactionMap = new HashMap<>(); + SQLiteDatabase sqLiteDatabase = getReadableDatabase(); + String query = "SELECT* FROM "+Table_Name1; + Cursor cursor = sqLiteDatabase.rawQuery(query,null); + + if(cursor.moveToFirst()){ + do { + Integer ID = cursor.getInt(0); + Date date = null; + try { + date = new SimpleDateFormat("dd/mm/yyyy").parse(cursor.getString(1)); + } catch (ParseException e) { + e.printStackTrace(); + } + String AccountNumber = cursor.getString(2); + String expenseType = cursor.getString(3); + ExpenseType ExpenseEN; + if (expenseType == "EXPENSE") { + ExpenseEN = ExpenseType.EXPENSE; + } else { + ExpenseEN = ExpenseType.INCOME; + } + double Amount = cursor.getDouble(4); + + Transaction transaction = new Transaction(date, AccountNumber, ExpenseEN, Amount); + TransactionMap.put(ID,transaction); + + }while(cursor.moveToNext()); + } + sqLiteDatabase.close(); + return TransactionMap; + } + + public void deleteAccount(String accountNo) { + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + sqLiteDatabase.delete(Table_Name0,ACCOUNT_NUMBER+" =?", new String[]{accountNo}); + sqLiteDatabase.close(); + + } + public void updateAccount(Account account){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(BALANCE,account.getBalance()); + sqLiteDatabase.update(Table_Name0,contentValues,ACCOUNT_NUMBER+"=?"+account.getAccountNo(),null); + sqLiteDatabase.close(); + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java index 46c5f78299..f81ed0ba00 100644 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java @@ -16,6 +16,7 @@ package lk.ac.mrt.cse.dbs.simpleexpensemanager.ui; +import android.content.Context; import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; @@ -28,6 +29,8 @@ import lk.ac.mrt.cse.dbs.simpleexpensemanager.R; import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.ExpenseManager; import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.InMemoryDemoExpenseManager; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.PersistentExpenseManager; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; public class MainActivity extends AppCompatActivity { private ExpenseManager expenseManager; @@ -45,9 +48,11 @@ public class MainActivity extends AppCompatActivity { * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; + private Context context; @Override protected void onCreate(Bundle savedInstanceState) { + context = this; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -65,8 +70,14 @@ protected void onCreate(Bundle savedInstanceState) { tabLayout.setupWithViewPager(mViewPager); /*** Begin generating dummy data for In-Memory implementation ***/ - expenseManager = new InMemoryDemoExpenseManager(); +// expenseManager = new InMemoryDemoExpenseManager(); /*** END ***/ + + try { + expenseManager = new PersistentExpenseManager(context); + } catch (ExpenseManagerException e) { + e.printStackTrace(); + } } /** From 16be7a957450fc660af8df4240d70feacdccd0c4 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:01:59 +0530 Subject: [PATCH 2/9] Delete BuildConfig.java --- .../cse/dbs/simpleexpensemanager/test/BuildConfig.java | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java diff --git a/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java b/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java deleted file mode 100644 index 5401844ed9..0000000000 --- a/app/build/generated/source/buildConfig/androidTest/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/test/BuildConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package lk.ac.mrt.cse.dbs.simpleexpensemanager.test; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "lk.ac.mrt.cse.dbs.simpleexpensemanager.test"; - public static final String BUILD_TYPE = "debug"; -} From 058ceed59359909fc62b8bf981a7ce44f93799b4 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:02:56 +0530 Subject: [PATCH 3/9] Delete BuildConfig.java --- .../cse/dbs/simpleexpensemanager/BuildConfig.java | 12 ------------ 1 file changed, 12 deletions(-) delete mode 100644 app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java diff --git a/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java b/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java deleted file mode 100644 index 16e7306c69..0000000000 --- a/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Automatically generated file. DO NOT MODIFY - */ -package lk.ac.mrt.cse.dbs.simpleexpensemanager; - -public final class BuildConfig { - public static final boolean DEBUG = Boolean.parseBoolean("true"); - public static final String APPLICATION_ID = "lk.ac.mrt.cse.dbs.simpleexpensemanager"; - public static final String BUILD_TYPE = "debug"; - public static final int VERSION_CODE = 1; - public static final String VERSION_NAME = "1.0"; -} From 12fc5c5159850a8dbb245c3af8c7685e3f094ae5 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:03:25 +0530 Subject: [PATCH 4/9] Delete DatabaseHelper.java --- .../database/DatabaseHelper.java | 171 ------------------ 1 file changed, 171 deletions(-) delete mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java deleted file mode 100644 index 486d7d302f..0000000000 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/database/DatabaseHelper.java +++ /dev/null @@ -1,171 +0,0 @@ -package lk.ac.mrt.cse.dbs.simpleexpensemanager.database; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.database.sqlite.SQLiteOpenHelper; -import android.support.annotation.Nullable; - -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; - -public class DatabaseHelper extends SQLiteOpenHelper { - - private static final int Version = 1; - public static final String DBname = "Accounts Database"; - public static final String Table_Name0 = "Accounts" ; - public static final String Table_Name1 = "Transactions" ; - private static final String ACCOUNT_NUMBER = "Account_Number"; - private static final String BALANCE = "Balance"; - private static final String BANK_NAME ="Bank_Name" ; - private static final String ACCOUNT_HOLDER_NAME = "Account_Holder_Name"; - private static final String DATE = "Date"; - private static final String EXPENSE_TYPE = "Transaction_Type"; - private static final String AMOUNT = "Amount"; - private static final String ID = "ID"; - - public DatabaseHelper(@Nullable Context context) { - super(context, DBname, null , Version); - } - - @Override - public void onCreate(SQLiteDatabase sqLiteDatabase) { - String TABLE_CREATE_QUERY_accounts = "CREATE TABLE "+Table_Name0+" "+ - "(" - +ACCOUNT_NUMBER+" TEXT PRIMARY KEY, " - +BANK_NAME+ " TEXT," - +ACCOUNT_HOLDER_NAME+" TEXT," - +BALANCE+" REAL" + - ");"; - /* CREATE TABLE Accounts (Account Number INTEGER PRIMARY KEY, Bank_Name TEXT, Account_Holder_Name TEXT,Balance REAL); */ - - String TABLE_CREATE_QUERY_transactions = "CREATE TABLE "+Table_Name1+" "+ - "(" - +ID+ "INTEGER PRIMARY KEY AUTOINCREMENT, " - +DATE+"TEXT, " - +ACCOUNT_NUMBER+"INTEGER PRIMARY KEY, " - +EXPENSE_TYPE+"TEXT, " - +AMOUNT+"REAL" - +");"; - - sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_accounts); - sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_transactions); - } - - @Override - public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { - String DROP_TABLE_QUERY_accounts = "DROP TABLE IF EXISTS "+Table_Name0; - String DROP_TABLE_QUERY_transactions = "DROP TABLE IF EXISTS "+Table_Name1; - - sqLiteDatabase.execSQL(DROP_TABLE_QUERY_accounts); - sqLiteDatabase.execSQL(DROP_TABLE_QUERY_transactions); - - onCreate(sqLiteDatabase); - } - public void addAccount(Account account){ - SQLiteDatabase sqLiteDatabase = getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - - contentValues.put(ACCOUNT_NUMBER,account.getAccountNo()); - contentValues.put(BANK_NAME,account.getBankName()); - contentValues.put(ACCOUNT_HOLDER_NAME,account.getAccountHolderName()); - contentValues.put(BALANCE,account.getBalance()); - - sqLiteDatabase.insert(Table_Name0,null,contentValues); - - sqLiteDatabase.close(); - } - - public List getAccounts(){ - List AccountsList = new ArrayList<>(); - SQLiteDatabase sqLiteDatabase = getReadableDatabase(); - String query = "SELECT* FROM "+Table_Name0; - Cursor cursor = sqLiteDatabase.rawQuery(query,null); - if(cursor.moveToFirst()){ - do{ - String accountNo = cursor.getString(0); - String bankName = cursor.getString(1); - String accountHolderName = cursor.getString(2); - Double balance = cursor.getDouble(3); - - Account account = new Account(accountNo,bankName,accountHolderName,balance); - AccountsList.add(account); - - }while(cursor.moveToNext()); - } - return AccountsList; - } - - public void addTransactions(Transaction transaction){ - SQLiteDatabase sqLiteDatabase = getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - - contentValues.put(DATE,transaction.getDate().toString()); - contentValues.put(ACCOUNT_NUMBER,transaction.getAccountNo()); - contentValues.put(EXPENSE_TYPE,transaction.getExpenseType().toString()); - contentValues.put(AMOUNT,transaction.getAmount()); - - sqLiteDatabase.insert(Table_Name1,null,contentValues); - sqLiteDatabase.close(); - } - - public Map getTransactions(){ - Map TransactionMap = new HashMap<>(); - SQLiteDatabase sqLiteDatabase = getReadableDatabase(); - String query = "SELECT* FROM "+Table_Name1; - Cursor cursor = sqLiteDatabase.rawQuery(query,null); - - if(cursor.moveToFirst()){ - do { - Integer ID = cursor.getInt(0); - Date date = null; - try { - date = new SimpleDateFormat("dd/mm/yyyy").parse(cursor.getString(1)); - } catch (ParseException e) { - e.printStackTrace(); - } - String AccountNumber = cursor.getString(2); - String expenseType = cursor.getString(3); - ExpenseType ExpenseEN; - if (expenseType == "EXPENSE") { - ExpenseEN = ExpenseType.EXPENSE; - } else { - ExpenseEN = ExpenseType.INCOME; - } - double Amount = cursor.getDouble(4); - - Transaction transaction = new Transaction(date, AccountNumber, ExpenseEN, Amount); - TransactionMap.put(ID,transaction); - - }while(cursor.moveToNext()); - } - sqLiteDatabase.close(); - return TransactionMap; - } - - public void deleteAccount(String accountNo) { - SQLiteDatabase sqLiteDatabase = getWritableDatabase(); - sqLiteDatabase.delete(Table_Name0,ACCOUNT_NUMBER+" =?", new String[]{accountNo}); - sqLiteDatabase.close(); - - } - public void updateAccount(Account account){ - SQLiteDatabase sqLiteDatabase = getWritableDatabase(); - ContentValues contentValues = new ContentValues(); - contentValues.put(BALANCE,account.getBalance()); - sqLiteDatabase.update(Table_Name0,contentValues,ACCOUNT_NUMBER+"=?"+account.getAccountNo(),null); - sqLiteDatabase.close(); - } -} From 87605a82f2980167f11a4073a452cb1c3bfa0214 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:03:48 +0530 Subject: [PATCH 5/9] Delete PersistentExpenseManager.java --- .../control/PersistentExpenseManager.java | 27 ------------------- 1 file changed, 27 deletions(-) delete mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java deleted file mode 100644 index 8073f763d8..0000000000 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java +++ /dev/null @@ -1,27 +0,0 @@ -package lk.ac.mrt.cse.dbs.simpleexpensemanager.control; - -import android.content.Context; - -import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentAccountDAO; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentTransactionDAO; - -public class PersistentExpenseManager extends ExpenseManager{ - private Context context; - - public PersistentExpenseManager(Context context) throws ExpenseManagerException { - this.context = context; - setup(); - } - @Override - public void setup() { - TransactionDAO persistentTransactionDAO = new PersistentTransactionDAO(context); - setTransactionsDAO(persistentTransactionDAO); - - AccountDAO persistentAccountDAO = new PersistentAccountDAO(context); - setAccountsDAO(persistentAccountDAO); - - } -} From 8d9168e9a5bd98a4800b5805603863c6b47cf207 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:06:02 +0530 Subject: [PATCH 6/9] Update MainActivity.java --- .../dbs/simpleexpensemanager/ui/MainActivity.java | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java index f81ed0ba00..7a317ce1d5 100644 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java @@ -16,7 +16,7 @@ package lk.ac.mrt.cse.dbs.simpleexpensemanager.ui; -import android.content.Context; + import android.os.Bundle; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; @@ -29,8 +29,6 @@ import lk.ac.mrt.cse.dbs.simpleexpensemanager.R; import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.ExpenseManager; import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.InMemoryDemoExpenseManager; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.PersistentExpenseManager; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; public class MainActivity extends AppCompatActivity { private ExpenseManager expenseManager; @@ -48,11 +46,10 @@ public class MainActivity extends AppCompatActivity { * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; - private Context context; + @Override protected void onCreate(Bundle savedInstanceState) { - context = this; super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); @@ -70,14 +67,9 @@ protected void onCreate(Bundle savedInstanceState) { tabLayout.setupWithViewPager(mViewPager); /*** Begin generating dummy data for In-Memory implementation ***/ -// expenseManager = new InMemoryDemoExpenseManager(); + expenseManager = new InMemoryDemoExpenseManager(); /*** END ***/ - try { - expenseManager = new PersistentExpenseManager(context); - } catch (ExpenseManagerException e) { - e.printStackTrace(); - } } /** From 1863d7c6f8a05a5af80f04cd0ac9afa29c779c51 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:06:59 +0530 Subject: [PATCH 7/9] Delete PersistentAccountDAO.java --- .../data/impl/PersistentAccountDAO.java | 88 ------------------- 1 file changed, 88 deletions(-) delete mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java deleted file mode 100644 index e3a227b1ba..0000000000 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java +++ /dev/null @@ -1,88 +0,0 @@ -package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; - -import android.content.Context; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.exception.InvalidAccountException; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.database.DatabaseHelper; - -public class PersistentAccountDAO implements AccountDAO { - private static Map accounts; - private DatabaseHelper dbHelper; - private Context context; - - public PersistentAccountDAO(Context context){ - this.accounts = new HashMap<>(); - this.context = context; - this.dbHelper = new DatabaseHelper(context); - - // To add the current database into the Map - currentAccountDatabase(dbHelper.getAccounts()); - } - - @Override - public List getAccountNumbersList() { - return new ArrayList<>(accounts.keySet()); - } - - - @Override - public List getAccountsList() { - return new ArrayList<>(accounts.values()); - } - - @Override - public Account getAccount(String accountNo) throws InvalidAccountException { - if (accounts.containsKey(accountNo)){ - return accounts.get(accountNo); - } - throw new InvalidAccountException("Account"+accountNo+"is not in the Database"); - } - - @Override - public void addAccount(Account account) { - if (!accounts.containsKey(account.getAccountNo())) { - dbHelper.addAccount(account); - accounts.put(account.getAccountNo(), account); - } - } - - @Override - public void removeAccount(String accountNo) throws InvalidAccountException { - if (accounts.containsKey(accountNo)){ - accounts.remove(accountNo); - dbHelper.deleteAccount(accountNo); - } - } - - @Override - public void updateBalance(String accountNo, ExpenseType expenseType, double amount) throws InvalidAccountException { - if (!accounts.containsKey(accountNo)){ - String ExceptionMsg = "Account"+accountNo+"is invalid."; - throw new InvalidAccountException(ExceptionMsg); - } - Account account = getAccount(accountNo); - switch (expenseType) { - case INCOME: - account.setBalance(account.getBalance() + amount); - break; - case EXPENSE: - account.setBalance(account.getBalance() - amount); - break; - } - dbHelper.updateAccount(account); - accounts.put(accountNo,account); - } - public void currentAccountDatabase(List AccountList){ - for (Account account:AccountList){ - accounts.put(account.getAccountNo(),account); - } - } -} From 91c3f3cd4de1310a24c0a6e8a345c0b2bd28b537 Mon Sep 17 00:00:00 2001 From: Savindu Rajapaksha <113894449+SavixDR@users.noreply.github.com> Date: Mon, 12 Dec 2022 22:07:07 +0530 Subject: [PATCH 8/9] Delete PersistentTransactionDAO.java --- .../data/impl/PersistentTransactionDAO.java | 50 ------------------- 1 file changed, 50 deletions(-) delete mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java deleted file mode 100644 index 534524f33f..0000000000 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java +++ /dev/null @@ -1,50 +0,0 @@ -package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; - -import android.content.Context; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.database.DatabaseHelper; - -public class PersistentTransactionDAO implements TransactionDAO { - private DatabaseHelper dbHelper; - private static Map transactionMap ; - private Context context; - - public PersistentTransactionDAO(Context context){ - context = this.context; - dbHelper = new DatabaseHelper(context); - transactionMap = dbHelper.getTransactions(); - } - - @Override - public void logTransaction(Date date, String accountNo, ExpenseType expenseType, double amount) { - Transaction transaction = new Transaction(date, accountNo, expenseType, amount); - dbHelper.addTransactions(transaction); - transactionMap = dbHelper.getTransactions(); - } - - @Override - public List getAllTransactionLogs() { - return (List) transactionMap.values(); -// return new ArrayList<>(transactionMap.values()); - } - - @Override - public List getPaginatedTransactionLogs(int limit) { - List transactions = (List) transactionMap.values(); - int size = transactions.size(); - if (size <= limit) { - return transactions; - } - // return the last limit number of transaction logs - return transactions.subList(size - limit, size); - } -} From 5830de17980fa338b5843b437fa53b9dc9f67851 Mon Sep 17 00:00:00 2001 From: SavixDR Date: Tue, 13 Dec 2022 09:41:08 +0530 Subject: [PATCH 9/9] DatabaseHelper.java made singleton Some Errors Fixed. --- .../dbs/simpleexpensemanager/BuildConfig.java | 12 ++ .../Database/DatabaseHelper.java | 180 ++++++++++++++++++ .../control/PersistentExpenseManager.java | 27 +++ .../data/impl/PersistentAccountDAO.java | 88 +++++++++ .../data/impl/PersistentTransactionDAO.java | 49 +++++ .../simpleexpensemanager/ui/MainActivity.java | 11 +- 6 files changed, 363 insertions(+), 4 deletions(-) create mode 100644 app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/Database/DatabaseHelper.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java create mode 100644 app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java diff --git a/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java b/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java new file mode 100644 index 0000000000..16e7306c69 --- /dev/null +++ b/app/build/generated/source/buildConfig/debug/lk/ac/mrt/cse/dbs/simpleexpensemanager/BuildConfig.java @@ -0,0 +1,12 @@ +/** + * Automatically generated file. DO NOT MODIFY + */ +package lk.ac.mrt.cse.dbs.simpleexpensemanager; + +public final class BuildConfig { + public static final boolean DEBUG = Boolean.parseBoolean("true"); + public static final String APPLICATION_ID = "lk.ac.mrt.cse.dbs.simpleexpensemanager"; + public static final String BUILD_TYPE = "debug"; + public static final int VERSION_CODE = 1; + public static final String VERSION_NAME = "1.0"; +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/Database/DatabaseHelper.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/Database/DatabaseHelper.java new file mode 100644 index 0000000000..998df5a9a8 --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/Database/DatabaseHelper.java @@ -0,0 +1,180 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.Database; + +import android.content.ContentValues; +import android.content.Context; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.database.sqlite.SQLiteOpenHelper; +import android.support.annotation.Nullable; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; + +public class DatabaseHelper extends SQLiteOpenHelper { + + private static DatabaseHelper dbHelper = null; + private static final int Version = 1; + public static final String DBname = "Accounts_Database.db"; + + public static final String Table_Name0 = "Accounts" ; + public static final String Table_Name1 = "Transactions" ; + private static final String ACCOUNT_NUMBER = "Account_Number"; + private static final String BALANCE = "Balance"; + private static final String BANK_NAME ="Bank_Name" ; + private static final String ACCOUNT_HOLDER_NAME = "Account_Holder_Name"; + private static final String DATE = "Date"; + private static final String EXPENSE_TYPE = "Transaction_Type"; + private static final String AMOUNT = "Amount"; + private static final String ID = "ID"; + + public DatabaseHelper(@Nullable Context context) { + super(context, DBname, null , Version); + } + public static DatabaseHelper getInstance(Context context){ + if (dbHelper == null){ + dbHelper = new DatabaseHelper(context); + } + return dbHelper; + } + + @Override + public void onCreate(SQLiteDatabase sqLiteDatabase) { + String TABLE_CREATE_QUERY_accounts = "CREATE TABLE "+Table_Name0+" "+ + "(" + +ACCOUNT_NUMBER+" TEXT PRIMARY KEY, " + +BANK_NAME+ " TEXT," + +ACCOUNT_HOLDER_NAME+" TEXT," + +BALANCE+" REAL check (" +BALANCE+">0)"+ + ");"; + /* CREATE TABLE Accounts (Account Number INTEGER PRIMARY KEY, Bank_Name TEXT, Account_Holder_Name TEXT,Balance REAL check (Balance>0)); */ + + String TABLE_CREATE_QUERY_transactions = "CREATE TABLE "+Table_Name1+" "+ + "(" + +ID+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + +DATE+" TEXT, " + +ACCOUNT_NUMBER+" TEXT, " + +EXPENSE_TYPE+" TEXT, " + +AMOUNT+" REAL check("+AMOUNT+">0)" + +");"; + /* CREATE TABLE Transactions (ID INTEGER PRIMARY KEY AUTOINCREMENT, Date TEXT, Account_Number TEXT, Transaction_Type TEXT, Amount REAL check (Amount>0)); */ + + sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_accounts); + sqLiteDatabase.execSQL(TABLE_CREATE_QUERY_transactions); + } + + @Override + public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { + String DROP_TABLE_QUERY_accounts = "DROP TABLE IF EXISTS "+Table_Name0; + String DROP_TABLE_QUERY_transactions = "DROP TABLE IF EXISTS "+Table_Name1; + + sqLiteDatabase.execSQL(DROP_TABLE_QUERY_accounts); + sqLiteDatabase.execSQL(DROP_TABLE_QUERY_transactions); + + onCreate(sqLiteDatabase); + } + public void addAccount(Account account){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + + contentValues.put(ACCOUNT_NUMBER,account.getAccountNo()); + contentValues.put(BANK_NAME,account.getBankName()); + contentValues.put(ACCOUNT_HOLDER_NAME,account.getAccountHolderName()); + contentValues.put(BALANCE,account.getBalance()); + + sqLiteDatabase.insert(Table_Name0,null,contentValues); + + sqLiteDatabase.close(); + } + + public List getAccounts(){ + List AccountsList = new ArrayList<>(); + SQLiteDatabase sqLiteDatabase = getReadableDatabase(); + String query = "SELECT* FROM "+Table_Name0; + Cursor cursor = sqLiteDatabase.rawQuery(query,null); + if(cursor.moveToFirst()){ + do{ + String accountNo = cursor.getString(0); + String bankName = cursor.getString(1); + String accountHolderName = cursor.getString(2); + Double balance = cursor.getDouble(3); + + Account account = new Account(accountNo,bankName,accountHolderName,balance); + AccountsList.add(account); + + }while(cursor.moveToNext()); + } + return AccountsList; + } + + public void addTransactions(Transaction transaction){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + + contentValues.put(DATE,new SimpleDateFormat("dd-MM-yyyy").format(transaction.getDate())); + contentValues.put(ACCOUNT_NUMBER,transaction.getAccountNo()); + contentValues.put(EXPENSE_TYPE,transaction.getExpenseType().toString()); + contentValues.put(AMOUNT,transaction.getAmount()); + + sqLiteDatabase.insert(Table_Name1,null,contentValues); + sqLiteDatabase.close(); + } + + public Map getTransactions(){ + Map TransactionMap = new HashMap<>(); + SQLiteDatabase sqLiteDatabase = this.getReadableDatabase(); + String query = "SELECT* FROM "+Table_Name1; + Cursor cursor = sqLiteDatabase.rawQuery(query,null); + + if(cursor.moveToFirst()){ + do { + Integer ID = cursor.getInt(0); + Date date = null; + try { + date = new SimpleDateFormat("dd-MM-yyyy").parse(cursor.getString(1)); + } catch (ParseException e) { + e.printStackTrace(); + } + String AccountNumber = cursor.getString(2); + String expenseType = cursor.getString(3); + ExpenseType ExpenseEN; + if (expenseType == "EXPENSE") { + ExpenseEN = ExpenseType.EXPENSE; + } else { + ExpenseEN = ExpenseType.INCOME; + } + double Amount = cursor.getDouble(4); + + Transaction transaction = new Transaction(date, AccountNumber, ExpenseEN, Amount); + TransactionMap.put(ID,transaction); + + }while(cursor.moveToNext()); + } + sqLiteDatabase.close(); + return TransactionMap; + } + + public void deleteAccount(String accountNo) { + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + sqLiteDatabase.delete(Table_Name0,ACCOUNT_NUMBER+" =?", new String[]{accountNo}); + sqLiteDatabase.close(); + + } + public void updateAccount(Account account){ + SQLiteDatabase sqLiteDatabase = getWritableDatabase(); + ContentValues contentValues = new ContentValues(); + contentValues.put(BALANCE,account.getBalance()); + sqLiteDatabase.update(Table_Name0,contentValues,ACCOUNT_NUMBER+"=?",new String[]{String.valueOf(account.getAccountNo())}); + sqLiteDatabase.close(); + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java new file mode 100644 index 0000000000..8073f763d8 --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/control/PersistentExpenseManager.java @@ -0,0 +1,27 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.control; + +import android.content.Context; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentAccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl.PersistentTransactionDAO; + +public class PersistentExpenseManager extends ExpenseManager{ + private Context context; + + public PersistentExpenseManager(Context context) throws ExpenseManagerException { + this.context = context; + setup(); + } + @Override + public void setup() { + TransactionDAO persistentTransactionDAO = new PersistentTransactionDAO(context); + setTransactionsDAO(persistentTransactionDAO); + + AccountDAO persistentAccountDAO = new PersistentAccountDAO(context); + setAccountsDAO(persistentAccountDAO); + + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java new file mode 100644 index 0000000000..773381d9a2 --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentAccountDAO.java @@ -0,0 +1,88 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.AccountDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.exception.InvalidAccountException; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Account; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.Database.DatabaseHelper; + +public class PersistentAccountDAO implements AccountDAO { + private static Map accounts; + private DatabaseHelper dbHelper; + private Context context; + + public PersistentAccountDAO(Context context){ + this.accounts = new HashMap<>(); + this.context = context; + this.dbHelper = DatabaseHelper.getInstance(context); + + // To add the current database into the Map + currentAccountDatabase(dbHelper.getAccounts()); + } + + @Override + public List getAccountNumbersList() { + return new ArrayList<>(accounts.keySet()); + } + + + @Override + public List getAccountsList() { + return new ArrayList<>(accounts.values()); + } + + @Override + public Account getAccount(String accountNo) throws InvalidAccountException { + if (accounts.containsKey(accountNo)){ + return accounts.get(accountNo); + } + throw new InvalidAccountException("Account"+accountNo+"is not in the Database"); + } + + @Override + public void addAccount(Account account) { + if (!accounts.containsKey(account.getAccountNo())) { + dbHelper.addAccount(account); + accounts.put(account.getAccountNo(), account); + } + } + + @Override + public void removeAccount(String accountNo) throws InvalidAccountException { + if (accounts.containsKey(accountNo)){ + accounts.remove(accountNo); + dbHelper.deleteAccount(accountNo); + } + } + + @Override + public void updateBalance(String accountNo, ExpenseType expenseType, double amount) throws InvalidAccountException { + if (!accounts.containsKey(accountNo)){ + String ExceptionMsg = "Account"+accountNo+"is invalid."; + throw new InvalidAccountException(ExceptionMsg); + } + Account account = getAccount(accountNo); + switch (expenseType) { + case INCOME: + account.setBalance(account.getBalance() + amount); + break; + case EXPENSE: + account.setBalance(account.getBalance() - amount); + break; + } + dbHelper.updateAccount(account); + accounts.put(accountNo,account); + } + public void currentAccountDatabase(List AccountList){ + for (Account account:AccountList){ + accounts.put(account.getAccountNo(),account); + } + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java new file mode 100644 index 0000000000..ea6703a24a --- /dev/null +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/data/impl/PersistentTransactionDAO.java @@ -0,0 +1,49 @@ +package lk.ac.mrt.cse.dbs.simpleexpensemanager.data.impl; + +import android.content.Context; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.TransactionDAO; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.ExpenseType; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.data.model.Transaction; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.Database.DatabaseHelper; + +public class PersistentTransactionDAO implements TransactionDAO { + private DatabaseHelper dbHelper; + private static Map transactionMap ; + private Context context; + + public PersistentTransactionDAO(Context context){ + this.context = this.context; + this.dbHelper = DatabaseHelper.getInstance(context); + this.transactionMap = dbHelper.getTransactions(); + } + + @Override + public void logTransaction(Date date, String accountNo, ExpenseType expenseType, double amount) { + Transaction transaction = new Transaction(date, accountNo, expenseType, amount); + dbHelper.addTransactions(transaction); + transactionMap = dbHelper.getTransactions(); + } + + @Override + public List getAllTransactionLogs() { + return new ArrayList<>(transactionMap.values()); + } + + @Override + public List getPaginatedTransactionLogs(int limit) { + List transactions = new ArrayList<>(transactionMap.values()); + int size = transactions.size(); + if (size <= limit) { + return transactions; + } + // return the last limit number of transaction logs + return transactions.subList(size - limit, size); + } +} diff --git a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java index 7a317ce1d5..8dd05716dd 100644 --- a/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java +++ b/app/src/main/java/lk/ac/mrt/cse/dbs/simpleexpensemanager/ui/MainActivity.java @@ -28,7 +28,8 @@ import lk.ac.mrt.cse.dbs.simpleexpensemanager.R; import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.ExpenseManager; -import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.InMemoryDemoExpenseManager; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.PersistentExpenseManager; +import lk.ac.mrt.cse.dbs.simpleexpensemanager.control.exception.ExpenseManagerException; public class MainActivity extends AppCompatActivity { private ExpenseManager expenseManager; @@ -46,8 +47,6 @@ public class MainActivity extends AppCompatActivity { * The {@link ViewPager} that will host the section contents. */ private ViewPager mViewPager; - - @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -67,9 +66,13 @@ protected void onCreate(Bundle savedInstanceState) { tabLayout.setupWithViewPager(mViewPager); /*** Begin generating dummy data for In-Memory implementation ***/ - expenseManager = new InMemoryDemoExpenseManager(); /*** END ***/ + try { + expenseManager = new PersistentExpenseManager(this); + } catch (ExpenseManagerException e) { + e.printStackTrace(); + } } /**