From ecd1a72e744e5cb67725a3fcde708576cf38f332 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 11:34:40 +0200 Subject: [PATCH 01/10] [30m]. Fix the issue with empty category when adding a record with existing one. --- .../moneytracker/controller/RecordController.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index 6691539..da26397 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -110,10 +110,10 @@ public List getRecords(Period period) { public void addRecord(Record record) { //Add category if it does not exist yet - if (categoryController.getCategoryIdByName(record.getCategory()) == -1) { + if (categoryController.getCategoryIdByName(record.getCategory()) == -1) categoryController.addCategory(record.getCategory()); - record.setCategoryId(categoryController.getCategoryIdByName(record.getCategory())); - } + + record.setCategoryId(categoryController.getCategoryIdByName(record.getCategory())); //Add record to DB SQLiteDatabase db = dbHelper.getWritableDatabase(); From 9a160999140e2836819254d222eea99dfcbd7d76 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 11:40:07 +0200 Subject: [PATCH 02/10] [30m]. Change inputType of initial sum of account to numberSigned. --- app/src/main/res/layout/activity_add_account.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/res/layout/activity_add_account.xml b/app/src/main/res/layout/activity_add_account.xml index 1014f13..57f2014 100644 --- a/app/src/main/res/layout/activity_add_account.xml +++ b/app/src/main/res/layout/activity_add_account.xml @@ -49,7 +49,7 @@ android:layout_height="wrap_content" android:layout_marginRight="10dp" android:layout_weight="1" - android:inputType="number" /> + android:inputType="numberSigned" /> From cb1d2f9b1e6b2150e936fdc7c58e438268d883b0 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 12:41:02 +0200 Subject: [PATCH 03/10] [30m]. Remove PeriodHelper + little refactoring. --- .../{helper/DBHelper.java => DbHelper.java} | 2 +- .../activity/AddAccountActivity.java | 2 +- .../moneytracker/activity/ReportActivity.java | 2 +- .../activity/TransferActivity.java | 2 +- .../activity/base/AddRecordBaseActivity.java | 2 +- .../controller/AccountController.java | 2 +- .../controller/CategoryController.java | 2 +- .../controller/RecordController.java | 2 +- .../controller/TransferController.java | 2 +- .../moneytracker/db/DbController.java | 45 ------- .../moneytracker/db/RecordController.java | 48 ------- .../moneytracker/db/RecordControllerImpl.java | 7 - .../moneytracker/db/StorageComponent.java | 7 - .../moneytracker/db/StorageModule.java | 7 - .../fragment/AccountsFragment.java | 2 +- .../moneytracker/fragment/ExportFragment.java | 2 +- .../fragment/RecordsFragment.java | 20 +-- .../moneytracker/helper/PeriodHelper.java | 125 ------------------ .../e_kanivets/moneytracker/model/Period.java | 100 +++++++++++++- .../e_kanivets/moneytracker/model/Record.java | 2 +- 20 files changed, 121 insertions(+), 262 deletions(-) rename app/src/main/java/com/blogspot/e_kanivets/moneytracker/{helper/DBHelper.java => DbHelper.java} (99%) delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java similarity index 99% rename from app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java rename to app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java index 6e49859..731745e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/DBHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java @@ -1,4 +1,4 @@ -package com.blogspot.e_kanivets.moneytracker.helper; +package com.blogspot.e_kanivets.moneytracker; import android.content.ContentValues; import android.content.Context; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java index df4400f..1083c6e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java @@ -9,7 +9,7 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import java.util.ArrayList; import java.util.Collections; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java index 6a3dc74..7e59334 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java @@ -12,7 +12,7 @@ import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter; import com.blogspot.e_kanivets.moneytracker.adapter.ReportItemAdapter; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Report; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java index 801dd78..c8b8fad 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java @@ -10,7 +10,7 @@ import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.TransferController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Transfer; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java index e011487..a953961 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java @@ -10,7 +10,7 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java index 606c13b..53a69a9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java @@ -6,7 +6,7 @@ import android.support.annotation.Nullable; import android.util.Log; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Transfer; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java index fb5f27d..9dde76e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java @@ -5,7 +5,7 @@ import android.database.sqlite.SQLiteDatabase; import android.util.Log; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Category; import java.util.ArrayList; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index da26397..adbad1c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -4,7 +4,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java index f1a9ca1..7c8995b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java @@ -5,7 +5,7 @@ import android.support.annotation.Nullable; import android.util.Log; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Transfer; /** diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java deleted file mode 100644 index 58d994c..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/DbController.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -import android.content.ContentValues; -import android.database.Cursor; - -/** - * Interface of the interaction with a Database. Insert, update, delete, query operation's - * implementations. - * Created on 9/1/15. - * - * @author Evgenii Kanivets - */ -public interface DbController { - /** - * Inserts a specified record into {@code tableName} with {@code id}. - * - * @param tableName table name of table to insert a record - * @param id id of the record - * @param contentValues map representation of the record - * @return true if inserted - */ - boolean insert(String tableName, String id, ContentValues contentValues); - - /** - * @param tableName table name of table to insert a record - * @param id id of the record - * @param contentValues map representation of the record - * @return true if updated - */ - boolean update(String tableName, String id, ContentValues contentValues); - - /** - * @param tableName table name of table to insert a record - * @param id id of the record - * @return true if deleted - */ - boolean delete(String tableName, String id); - - /** - * @param tableName table name of table to insert a record - * @param selection selection statement - * @return Cursor with a matched records - */ - Cursor query(String tableName, String selection); -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java deleted file mode 100644 index 68ec831..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -import com.blogspot.e_kanivets.moneytracker.model.Record; - -import java.util.Date; -import java.util.List; - -/** - * Interface for controlling of records. Every record has to have a unique id. - * Created on 9/1/15. - * - * @author Evgenii Kanivets - */ -public interface RecordController { - /** - * Adds a given record to the storage. Checks if such record has already exists, - * if yes the record will not be added. - * - * @param record record to add - * @return true if added, false if not - */ - boolean addRecord(Record record); - - /** - * Deletes a record from storage if such record exists. - * - * @param record record to remove - * @return true if record was deleted, false if not - */ - boolean deleteRecord(Record record); - - /** - * Updates a record in storage if exists, if no - nothing will happen. - * - * @param record record to update - * @return true if record was changed, false if not - */ - boolean updateRecord(Record record); - - /** - * Fetches records from {@code fromTime} to {@code toTime} from storage. - * - * @param fromTime {@link Date} representation of period start - * @param toTime {@link Date} representation of period end - * @return list of mathced records - */ - List getRecords(Date fromTime, Date toTime); -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java deleted file mode 100644 index b0d7f86..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/RecordControllerImpl.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/2/15. - */ -public class RecordControllerImpl { -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java deleted file mode 100644 index 25777cc..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageComponent.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/3/15. - */ -public class StorageComponent { -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java deleted file mode 100644 index 322018a..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/db/StorageModule.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.db; - -/** - * Created by alla on 9/3/15. - */ -public class StorageModule { -} diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java index 1fe1f04..60063fd 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java @@ -24,7 +24,7 @@ import com.blogspot.e_kanivets.moneytracker.activity.TransferActivity; import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import butterknife.Bind; import butterknife.ButterKnife; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java index 9fdde56..e1a92ee 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java @@ -13,7 +13,7 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.util.Constants; import java.io.File; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java index 9afafff..ee63d51 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java @@ -29,8 +29,8 @@ import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter; import com.blogspot.e_kanivets.moneytracker.controller.PeriodController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; -import com.blogspot.e_kanivets.moneytracker.helper.PeriodHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog; import com.blogspot.e_kanivets.moneytracker.ui.ChangeDateDialog; @@ -250,22 +250,22 @@ public void onItemSelected(AdapterView parent, View view, int position, long calendar.clear(Calendar.MILLISECOND); switch (position) { - // Day period case 0: - periodController.setPeriod(PeriodHelper.getInstance().getDayPeriod()); + periodController.setPeriod(Period.dayPeriod()); break; - // Week period + case 1: - periodController.setPeriod(PeriodHelper.getInstance().getWeekPeriod()); + periodController.setPeriod(Period.weekPeriod()); break; - // Month period + case 2: - periodController.setPeriod(PeriodHelper.getInstance().getMonthPeriod()); + periodController.setPeriod(Period.monthPeriod()); break; - // Year period + case 3: - periodController.setPeriod(PeriodHelper.getInstance().getYearPeriod()); + periodController.setPeriod(Period.yearPeriod()); break; + default: break; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java deleted file mode 100644 index 2f778f7..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/helper/PeriodHelper.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.helper; - -import com.blogspot.e_kanivets.moneytracker.model.Period; - -import java.util.Calendar; -import java.util.Date; - -/** - * Helper class for periods. - * Created on 15.11.2014. - * - * @author Evgenii Kanivets - */ -public class PeriodHelper { - - private static PeriodHelper periodHelper; - - public static PeriodHelper getInstance() { - if(periodHelper == null) { - periodHelper = new PeriodHelper(); - } - - return periodHelper; - } - - private PeriodHelper() {} - - public Period getDayPeriod() { - //set start of day - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - Date first = cal.getTime(); - - //set end of day - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getWeekPeriod() { - // set start of week - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - // set first day of week - cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); - - Date first = cal.getTime(); - - // set last day of week - cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() + 6); - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getMonthPeriod() { - //set start of month - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - cal.set(Calendar.DAY_OF_MONTH, 1); - - Date first = cal.getTime(); - - //set end of month - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - - Date last = cal.getTime(); - - return new Period(first, last); - } - - public Period getYearPeriod() { - //set start of year - Calendar cal = Calendar.getInstance(); - cal.set(Calendar.HOUR_OF_DAY, 0); - cal.set(Calendar.MINUTE, 0); - cal.set(Calendar.SECOND, 0); - cal.set(Calendar.MILLISECOND, 0); - - cal.set(Calendar.MONTH, Calendar.JANUARY); - cal.set(Calendar.DAY_OF_MONTH, 1); - - Date first = cal.getTime(); - - //set end of year - cal.set(Calendar.HOUR_OF_DAY, 23); - cal.set(Calendar.MINUTE, 59); - cal.set(Calendar.SECOND, 59); - cal.set(Calendar.MILLISECOND, 999); - - cal.set(Calendar.MONTH, Calendar.DECEMBER); - cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); - - Date last = cal.getTime(); - - return new Period(first, last); - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java index ff7f2d2..ef4aa4e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Period.java @@ -78,4 +78,102 @@ public void writeToParcel(Parcel dest, int flags) { dest.writeLong(first.getTime()); dest.writeLong(last.getTime()); } -} + + public static Period dayPeriod() { + //set start of day + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + Date first = cal.getTime(); + + //set end of day + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period weekPeriod() { + // set start of week + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + // set first day of week + cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek()); + + Date first = cal.getTime(); + + // set last day of week + cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek() + 6); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period monthPeriod() { + //set start of month + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + cal.set(Calendar.DAY_OF_MONTH, 1); + + Date first = cal.getTime(); + + //set end of month + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + + Date last = cal.getTime(); + + return new Period(first, last); + } + + public static Period yearPeriod() { + //set start of year + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MILLISECOND, 0); + + cal.set(Calendar.MONTH, Calendar.JANUARY); + cal.set(Calendar.DAY_OF_MONTH, 1); + + Date first = cal.getTime(); + + //set end of year + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MILLISECOND, 999); + + cal.set(Calendar.MONTH, Calendar.DECEMBER); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + + Date last = cal.getTime(); + + return new Period(first, last); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java index 2b2f584..d32d41c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java @@ -1,7 +1,7 @@ package com.blogspot.e_kanivets.moneytracker.model; import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; -import com.blogspot.e_kanivets.moneytracker.helper.DbHelper; +import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.MtApp; import java.io.Serializable; From 9b76a04f7b9adf0f9ba0dc877e840c9e48d74aec Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 13:01:24 +0200 Subject: [PATCH 04/10] #9[30m]. Add IRepo interface. --- .../e_kanivets/moneytracker/repo/IRepo.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java new file mode 100644 index 0000000..dd66475 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/IRepo.java @@ -0,0 +1,69 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.database.sqlite.SQLiteOpenHelper; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import java.util.List; + +/** + * Interface that represents a contract of access to abstract storage with CRUD operations. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public interface IRepo { + /** + * Creates a record with given fields values in storage. + * + * @param instance is entity instance to be created. + * @return created record or null if can't create. + */ + @Nullable + T create(T instance); + + /** + * Reads a record from storage. + * + * @param id is identification number of record to be read. + * @return read record or null if one not exist. + */ + @Nullable + T read(long id); + + /** + * Updates a record in storage. + * + * @param instance is entity instance to be updated. + * @return updated record or null if can't update. + */ + @Nullable + T update(T instance); + + /** + * Deletes a record from storage. + * + * @param instance is entity instance to be deleted. + * @return true if deleted or false if not. + */ + boolean delete(T instance); + + /** + * Reads all records from storage. + * + * @return list of all records. List can't be null, but may be zero sized. + */ + @NonNull + List readAll(); + + /** + * Reads all records from storage that matches given condition. The same as in standard Android + * {@link SQLiteOpenHelper}. + * + * @param condition is a string of selection. For example - "time BETWEEN ? AND ?". + * @param args is a string array with data to be inserted in condition string instead of '?'. + * @return list of matched records. List can't be null, but may be zero sized. + */ + @NonNull + List readWithCondition(String condition, String[] args); +} \ No newline at end of file From e6c4ed7a9ee3b7d2e53f52e297ec566a1d0dc911 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 13:43:19 +0200 Subject: [PATCH 05/10] #10[30m]. Refactor AccountController, add AccountRepo. --- .../activity/AddAccountActivity.java | 8 +- .../activity/TransferActivity.java | 6 +- .../activity/base/AddRecordBaseActivity.java | 21 +-- .../controller/AccountController.java | 133 ++------------- .../controller/RecordController.java | 3 +- .../fragment/AccountsFragment.java | 12 +- .../moneytracker/model/Account.java | 7 + .../moneytracker/repo/AccountRepo.java | 152 ++++++++++++++++++ 8 files changed, 201 insertions(+), 141 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java index 1083c6e..dc5d592 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java @@ -8,8 +8,9 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.Collections; @@ -75,8 +76,9 @@ private void addAccount() { int initSum = Integer.parseInt(etInitSum.getText().toString().trim()); String currency = (String) spinner.getSelectedItem(); - new AccountController(new DbHelper(AddAccountActivity.this)) - .addAccount(title, initSum, currency); + Account account = new Account(title, initSum, currency); + + new AccountRepo(new DbHelper(AddAccountActivity.this)).create(account); } public static List getAllCurrencies() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java index c8b8fad..9e3127e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java @@ -13,6 +13,7 @@ import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Transfer; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.List; @@ -45,10 +46,11 @@ protected int getContentViewId() { protected boolean initData() { DbHelper dbHelper = new DbHelper(TransferActivity.this); - AccountController accountController = new AccountController(dbHelper); + AccountRepo accountRepo = new AccountRepo(dbHelper); + AccountController accountController = new AccountController(accountRepo); transferController = new TransferController(dbHelper, accountController); - accountList = accountController.getAccounts(); + accountList = accountRepo.readAll(); return super.initData(); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java index a953961..eb0ac2b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java @@ -8,11 +8,11 @@ import android.widget.Spinner; import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.List; @@ -36,6 +36,11 @@ public abstract class AddRecordBaseActivity extends BaseActivity { protected Record record; protected Mode mode; + protected List accountList; + + protected AccountRepo accountRepo; + protected RecordController recordController; + @Bind(R.id.et_title) EditText etTitle; @Bind(R.id.et_category) @@ -45,9 +50,6 @@ public abstract class AddRecordBaseActivity extends BaseActivity { @Bind(R.id.spinner_account) Spinner spinnerAccount; - protected RecordController recordController; - protected AccountController accountController; - @Override protected int getContentViewId() { return R.layout.activity_add_record; @@ -57,11 +59,14 @@ protected int getContentViewId() { protected boolean initData() { super.initData(); - recordController = new RecordController(new DbHelper(AddRecordBaseActivity.this)); - accountController = new AccountController(new DbHelper(AddRecordBaseActivity.this)); + DbHelper dbHelper = new DbHelper(AddRecordBaseActivity.this); + + accountRepo = new AccountRepo(dbHelper); + recordController = new RecordController(dbHelper); record = (Record) getIntent().getSerializableExtra(KEY_RECORD); mode = (Mode) getIntent().getSerializableExtra(KEY_MODE); + accountList = accountRepo.readAll(); return mode != null && (!mode.equals(Mode.MODE_EDIT) || record != null); } @@ -71,8 +76,6 @@ record = (Record) getIntent().getSerializableExtra(KEY_RECORD); protected void initViews() { super.initViews(); - List accountList = accountController.getAccounts(); - List accounts = new ArrayList<>(); for (Account account : accountList) { accounts.add(account.getTitle()); @@ -137,7 +140,7 @@ private boolean prepareRecord() { } if (price >= 0 && price <= 1000000000 && spinnerAccount.getSelectedItemPosition() >= 0) { - Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition()); + Account account = accountList.get(spinnerAccount.getSelectedItemPosition()); return doRecord(title, category, price, account); } else return false; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java index 53a69a9..ff09e3a 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java @@ -1,18 +1,11 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.support.annotation.Nullable; -import android.util.Log; -import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Transfer; - -import java.util.ArrayList; -import java.util.List; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; /** * Controller class to encapsulate account handling logic. @@ -21,117 +14,19 @@ * @author Evgenii Kanivets */ public class AccountController { + @SuppressWarnings("unused") private static final String TAG = "AccountController"; - private DbHelper dbHelper; - - public AccountController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - } - - public List getAccounts() { - List accountList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, null, null, null, null, null); - - if (cursor.moveToFirst()) { - // Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); - int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); - - do { - // Read a account from DB - Account account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - //Add account to list - accountList.add(account); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return accountList; - } - - @Nullable - public Account read(long id) { - Account account = null; - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", - new String[]{Long.toString(id)}, null, null, null); - - if (cursor.moveToFirst()) { - // Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); - int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); + private AccountRepo accountRepo; - do { - // Read a account from DB - account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return account; - } - - public void update(Account account) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); - - db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", - new String[]{Integer.valueOf(account.getId()).toString()}); - - db.close(); - } - - public void deleteAccount(Account account) { - // Delete the account from DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", new String[]{Integer.toString(account.getId())}); - db.close(); - } - - public void addAccount(String title, int curSum, String currency) { - //Add account to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TITLE_COLUMN, title); - contentValues.put(DbHelper.CUR_SUM_COLUMN, curSum); - contentValues.put(DbHelper.CURRENCY_COLUMN, currency); - - db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); - - db.close(); + public AccountController(AccountRepo accountRepo) { + this.accountRepo = accountRepo; } public boolean recordAdded(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -147,9 +42,7 @@ public boolean recordAdded(@Nullable Record record) { break; } - Log.d(TAG, "recordAdded: " + account); - - update(account); + accountRepo.update(account); return true; } @@ -157,7 +50,7 @@ public boolean recordAdded(@Nullable Record record) { public boolean recordDeleted(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -173,7 +66,7 @@ public boolean recordDeleted(@Nullable Record record) { break; } - update(account); + accountRepo.update(account); return true; } @@ -188,16 +81,16 @@ public boolean recordUpdated(@Nullable Record oldRecord, @Nullable Record newRec public boolean transferDone(@Nullable Transfer transfer) { if(transfer == null) return false; - Account fromAccount = read(transfer.getFromAccountId()); - Account toAccount = read(transfer.getToAccountId()); + Account fromAccount = accountRepo.read(transfer.getFromAccountId()); + Account toAccount = accountRepo.read(transfer.getToAccountId()); if (fromAccount == null || toAccount == null) return false; fromAccount.take(transfer.getFromAmount()); toAccount.put(transfer.getToAmount()); - update(fromAccount); - update(toAccount); + accountRepo.update(fromAccount); + accountRepo.update(toAccount); return true; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index adbad1c..57937a4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -7,6 +7,7 @@ import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.List; @@ -24,7 +25,7 @@ public class RecordController { public RecordController(DbHelper dbHelper) { this.dbHelper = dbHelper; - this.accountController = new AccountController(dbHelper); + this.accountController = new AccountController(new AccountRepo(dbHelper)); categoryController = new CategoryController(dbHelper); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java index 60063fd..974054c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java @@ -23,8 +23,8 @@ import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; import com.blogspot.e_kanivets.moneytracker.activity.TransferActivity; import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import butterknife.Bind; import butterknife.ButterKnife; @@ -39,7 +39,7 @@ public class AccountsFragment extends Fragment { @Bind(R.id.list_view) ListView listView; - private AccountController accountController; + private AccountRepo accountRepo; public static AccountsFragment newInstance() { AccountsFragment fragment = new AccountsFragment(); @@ -57,7 +57,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - accountController = new AccountController(new DbHelper(getActivity())); + accountRepo = new AccountRepo(new DbHelper(getActivity())); } @Override @@ -116,7 +116,7 @@ public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.delete: - accountController.deleteAccount(accountController.getAccounts().get(info.position)); + accountRepo.delete(accountRepo.readAll().get(info.position)); update(); return true; default: @@ -145,7 +145,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } @@ -153,7 +153,7 @@ private void initViews(View rootView) { if (rootView != null) { ButterKnife.bind(this, rootView); - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); registerForContextMenu(listView); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java index 6f7fbfa..3a9f3d1 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java @@ -17,6 +17,13 @@ public Account(int id, String title, int curSum, String currency) { this.currency = currency; } + public Account(String title, int curSum, String currency) { + this.id = -1; + this.title = title; + this.curSum = curSum; + this.currency = currency; + } + public int getId() { return id; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java new file mode 100644 index 0000000..82ba245 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java @@ -0,0 +1,152 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Account} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class AccountRepo implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "AccountRepo"; + + private DbHelper dbHelper; + + public AccountRepo(DbHelper dbHelper) { + this.dbHelper = dbHelper; + } + + @Nullable + @Override + public Account create(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); + + long id = db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create account : " + account); + return null; + } else { + Account createdAccount = read(id); + Log.d(TAG, "Created account : " + account); + return createdAccount; + } + } + + @Nullable + @Override + public Account read(long id) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", + new String[]{Long.toString(id)}, null, null, null); + List accountList = getAccountListFromCursor(cursor); + + cursor.close(); + db.close(); + + if (accountList.size() == 1) return accountList.get(0); + else return null; + } + + @Nullable + @Override + public Account update(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + + String[] args = new String[]{Integer.valueOf(account.getId()).toString()}; + long rowsAffected = db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update account : " + account); + return null; + } else { + Log.d(TAG, "Updated account : " + account); + return read(account.getId()); + } + } + + @Override + public boolean delete(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Integer.toString(account.getId())}; + long rowsAffected = db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", args); + + db.close(); + + Log.d(TAG, account + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, condition, args, null, null, null); + List accountList = getAccountListFromCursor(cursor); + + cursor.close(); + db.close(); + + return accountList; + } + + private List getAccountListFromCursor(Cursor cursor) { + List accountList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + // Get indexes of columns + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); + int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); + int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); + + do { + // Read a account from DB + Account account = new Account(cursor.getInt(idColIndex), + cursor.getString(titleColIndex), + cursor.getInt(curSumColIndex), + cursor.getString(currencyColIndex)); + + accountList.add(account); + } while (cursor.moveToNext()); + } + + return accountList; + } +} \ No newline at end of file From d4e981a65c600d0491c72b295d58cace3e2a18e9 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 13:43:19 +0200 Subject: [PATCH 06/10] #10[30m]. Refactor AccountController, add AccountRepo. --- .../activity/AddAccountActivity.java | 8 +- .../activity/TransferActivity.java | 7 +- .../activity/base/AddRecordBaseActivity.java | 22 +-- .../controller/AccountController.java | 133 ++------------- .../controller/RecordController.java | 3 +- .../fragment/AccountsFragment.java | 14 +- .../moneytracker/model/Account.java | 7 + .../moneytracker/repo/AccountRepo.java | 152 ++++++++++++++++++ 8 files changed, 205 insertions(+), 141 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java index 1083c6e..dc5d592 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddAccountActivity.java @@ -8,8 +8,9 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.Collections; @@ -75,8 +76,9 @@ private void addAccount() { int initSum = Integer.parseInt(etInitSum.getText().toString().trim()); String currency = (String) spinner.getSelectedItem(); - new AccountController(new DbHelper(AddAccountActivity.this)) - .addAccount(title, initSum, currency); + Account account = new Account(title, initSum, currency); + + new AccountRepo(new DbHelper(AddAccountActivity.this)).create(account); } public static List getAllCurrencies() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java index c8b8fad..d25a28b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java @@ -13,6 +13,8 @@ import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Transfer; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import java.util.ArrayList; import java.util.List; @@ -45,10 +47,11 @@ protected int getContentViewId() { protected boolean initData() { DbHelper dbHelper = new DbHelper(TransferActivity.this); - AccountController accountController = new AccountController(dbHelper); + IRepo accountRepo = new AccountRepo(dbHelper); + AccountController accountController = new AccountController(accountRepo); transferController = new TransferController(dbHelper, accountController); - accountList = accountController.getAccounts(); + accountList = accountRepo.readAll(); return super.initData(); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java index a953961..9052a8e 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java @@ -8,11 +8,12 @@ import android.widget.Spinner; import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import java.util.ArrayList; import java.util.List; @@ -36,6 +37,11 @@ public abstract class AddRecordBaseActivity extends BaseActivity { protected Record record; protected Mode mode; + protected List accountList; + + protected IRepo accountRepo; + protected RecordController recordController; + @Bind(R.id.et_title) EditText etTitle; @Bind(R.id.et_category) @@ -45,9 +51,6 @@ public abstract class AddRecordBaseActivity extends BaseActivity { @Bind(R.id.spinner_account) Spinner spinnerAccount; - protected RecordController recordController; - protected AccountController accountController; - @Override protected int getContentViewId() { return R.layout.activity_add_record; @@ -57,11 +60,14 @@ protected int getContentViewId() { protected boolean initData() { super.initData(); - recordController = new RecordController(new DbHelper(AddRecordBaseActivity.this)); - accountController = new AccountController(new DbHelper(AddRecordBaseActivity.this)); + DbHelper dbHelper = new DbHelper(AddRecordBaseActivity.this); + + accountRepo = new AccountRepo(dbHelper); + recordController = new RecordController(dbHelper); record = (Record) getIntent().getSerializableExtra(KEY_RECORD); mode = (Mode) getIntent().getSerializableExtra(KEY_MODE); + accountList = accountRepo.readAll(); return mode != null && (!mode.equals(Mode.MODE_EDIT) || record != null); } @@ -71,8 +77,6 @@ record = (Record) getIntent().getSerializableExtra(KEY_RECORD); protected void initViews() { super.initViews(); - List accountList = accountController.getAccounts(); - List accounts = new ArrayList<>(); for (Account account : accountList) { accounts.add(account.getTitle()); @@ -137,7 +141,7 @@ private boolean prepareRecord() { } if (price >= 0 && price <= 1000000000 && spinnerAccount.getSelectedItemPosition() >= 0) { - Account account = accountController.getAccounts().get(spinnerAccount.getSelectedItemPosition()); + Account account = accountList.get(spinnerAccount.getSelectedItemPosition()); return doRecord(title, category, price, account); } else return false; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java index 53a69a9..a7d2e3b 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/AccountController.java @@ -1,18 +1,11 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.support.annotation.Nullable; -import android.util.Log; -import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Transfer; - -import java.util.ArrayList; -import java.util.List; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; /** * Controller class to encapsulate account handling logic. @@ -21,117 +14,19 @@ * @author Evgenii Kanivets */ public class AccountController { + @SuppressWarnings("unused") private static final String TAG = "AccountController"; - private DbHelper dbHelper; - - public AccountController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - } - - public List getAccounts() { - List accountList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, null, null, null, null, null); - - if (cursor.moveToFirst()) { - // Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); - int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); - - do { - // Read a account from DB - Account account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - //Add account to list - accountList.add(account); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return accountList; - } - - @Nullable - public Account read(long id) { - Account account = null; - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", - new String[]{Long.toString(id)}, null, null, null); - - if (cursor.moveToFirst()) { - // Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); - int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); + private IRepo accountRepo; - do { - // Read a account from DB - account = new Account(cursor.getInt(idColIndex), - cursor.getString(titleColIndex), - cursor.getInt(curSumColIndex), - cursor.getString(currencyColIndex)); - - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return account; - } - - public void update(Account account) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); - - db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", - new String[]{Integer.valueOf(account.getId()).toString()}); - - db.close(); - } - - public void deleteAccount(Account account) { - // Delete the account from DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", new String[]{Integer.toString(account.getId())}); - db.close(); - } - - public void addAccount(String title, int curSum, String currency) { - //Add account to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TITLE_COLUMN, title); - contentValues.put(DbHelper.CUR_SUM_COLUMN, curSum); - contentValues.put(DbHelper.CURRENCY_COLUMN, currency); - - db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); - - db.close(); + public AccountController(IRepo accountRepo) { + this.accountRepo = accountRepo; } public boolean recordAdded(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -147,9 +42,7 @@ public boolean recordAdded(@Nullable Record record) { break; } - Log.d(TAG, "recordAdded: " + account); - - update(account); + accountRepo.update(account); return true; } @@ -157,7 +50,7 @@ public boolean recordAdded(@Nullable Record record) { public boolean recordDeleted(@Nullable Record record) { if (record == null) return false; - Account account = read(record.getAccountId()); + Account account = accountRepo.read(record.getAccountId()); if (account == null) return false; switch (record.getType()) { @@ -173,7 +66,7 @@ public boolean recordDeleted(@Nullable Record record) { break; } - update(account); + accountRepo.update(account); return true; } @@ -188,16 +81,16 @@ public boolean recordUpdated(@Nullable Record oldRecord, @Nullable Record newRec public boolean transferDone(@Nullable Transfer transfer) { if(transfer == null) return false; - Account fromAccount = read(transfer.getFromAccountId()); - Account toAccount = read(transfer.getToAccountId()); + Account fromAccount = accountRepo.read(transfer.getFromAccountId()); + Account toAccount = accountRepo.read(transfer.getToAccountId()); if (fromAccount == null || toAccount == null) return false; fromAccount.take(transfer.getFromAmount()); toAccount.put(transfer.getToAmount()); - update(fromAccount); - update(toAccount); + accountRepo.update(fromAccount); + accountRepo.update(toAccount); return true; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index adbad1c..57937a4 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -7,6 +7,7 @@ import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import java.util.ArrayList; import java.util.List; @@ -24,7 +25,7 @@ public class RecordController { public RecordController(DbHelper dbHelper) { this.dbHelper = dbHelper; - this.accountController = new AccountController(dbHelper); + this.accountController = new AccountController(new AccountRepo(dbHelper)); categoryController = new CategoryController(dbHelper); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java index 60063fd..e40f173 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/AccountsFragment.java @@ -23,8 +23,10 @@ import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; import com.blogspot.e_kanivets.moneytracker.activity.TransferActivity; import com.blogspot.e_kanivets.moneytracker.adapter.AccountAdapter; -import com.blogspot.e_kanivets.moneytracker.controller.AccountController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import butterknife.Bind; import butterknife.ButterKnife; @@ -39,7 +41,7 @@ public class AccountsFragment extends Fragment { @Bind(R.id.list_view) ListView listView; - private AccountController accountController; + private IRepo accountRepo; public static AccountsFragment newInstance() { AccountsFragment fragment = new AccountsFragment(); @@ -57,7 +59,7 @@ public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); - accountController = new AccountController(new DbHelper(getActivity())); + accountRepo = new AccountRepo(new DbHelper(getActivity())); } @Override @@ -116,7 +118,7 @@ public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.delete: - accountController.deleteAccount(accountController.getAccounts().get(info.position)); + accountRepo.delete(accountRepo.readAll().get(info.position)); update(); return true; default: @@ -145,7 +147,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } @@ -153,7 +155,7 @@ private void initViews(View rootView) { if (rootView != null) { ButterKnife.bind(this, rootView); - listView.setAdapter(new AccountAdapter(getActivity(), accountController.getAccounts())); + listView.setAdapter(new AccountAdapter(getActivity(), accountRepo.readAll())); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); registerForContextMenu(listView); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java index 6f7fbfa..3a9f3d1 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java @@ -17,6 +17,13 @@ public Account(int id, String title, int curSum, String currency) { this.currency = currency; } + public Account(String title, int curSum, String currency) { + this.id = -1; + this.title = title; + this.curSum = curSum; + this.currency = currency; + } + public int getId() { return id; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java new file mode 100644 index 0000000..82ba245 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java @@ -0,0 +1,152 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Account; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Account} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class AccountRepo implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "AccountRepo"; + + private DbHelper dbHelper; + + public AccountRepo(DbHelper dbHelper) { + this.dbHelper = dbHelper; + } + + @Nullable + @Override + public Account create(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); + + long id = db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create account : " + account); + return null; + } else { + Account createdAccount = read(id); + Log.d(TAG, "Created account : " + account); + return createdAccount; + } + } + + @Nullable + @Override + public Account read(long id) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", + new String[]{Long.toString(id)}, null, null, null); + List accountList = getAccountListFromCursor(cursor); + + cursor.close(); + db.close(); + + if (accountList.size() == 1) return accountList.get(0); + else return null; + } + + @Nullable + @Override + public Account update(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + + String[] args = new String[]{Integer.valueOf(account.getId()).toString()}; + long rowsAffected = db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update account : " + account); + return null; + } else { + Log.d(TAG, "Updated account : " + account); + return read(account.getId()); + } + } + + @Override + public boolean delete(Account account) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Integer.toString(account.getId())}; + long rowsAffected = db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", args); + + db.close(); + + Log.d(TAG, account + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, condition, args, null, null, null); + List accountList = getAccountListFromCursor(cursor); + + cursor.close(); + db.close(); + + return accountList; + } + + private List getAccountListFromCursor(Cursor cursor) { + List accountList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + // Get indexes of columns + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); + int curSumColIndex = cursor.getColumnIndex(DbHelper.CUR_SUM_COLUMN); + int currencyColIndex = cursor.getColumnIndex(DbHelper.CURRENCY_COLUMN); + + do { + // Read a account from DB + Account account = new Account(cursor.getInt(idColIndex), + cursor.getString(titleColIndex), + cursor.getInt(curSumColIndex), + cursor.getString(currencyColIndex)); + + accountList.add(account); + } while (cursor.moveToNext()); + } + + return accountList; + } +} \ No newline at end of file From 1045c14b34a9dcbe4f69346464ce8a91c8b1fc82 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 15:37:36 +0200 Subject: [PATCH 07/10] #10[30m]. Refactor CategoryController, add CategoryRepo. --- .../controller/CategoryController.java | 86 ++--------- .../controller/RecordController.java | 22 ++- .../moneytracker/model/Account.java | 6 +- .../moneytracker/model/Category.java | 23 ++- .../e_kanivets/moneytracker/model/Record.java | 6 +- .../moneytracker/repo/AccountRepo.java | 18 +-- .../moneytracker/repo/CategoryRepo.java | 140 ++++++++++++++++++ 7 files changed, 196 insertions(+), 105 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java index 9dde76e..9c76565 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/CategoryController.java @@ -1,14 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; -import android.util.Log; - import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Category; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; -import java.util.ArrayList; import java.util.List; /** @@ -18,80 +13,21 @@ * @author Evgenii Kanivets */ public class CategoryController { + @SuppressWarnings("unused") private static final String TAG = "CategoryController"; - private DbHelper dbHelper; - - public CategoryController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - } - - public List getCategories() { - List categoryList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Read categories table from db - Cursor cursor = db.query(DbHelper.TABLE_CATEGORIES, null, null, null, null, null, null); - - if (cursor.moveToFirst()) { - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int nameColIndex = cursor.getColumnIndex(DbHelper.NAME_COLUMN); - - do { - //Read a record from DB - Category category = new Category(cursor.getInt(idColIndex), - cursor.getString(nameColIndex)); - - //Add record to list - categoryList.add(category); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return categoryList; - } - - public int addCategory(String name) { - //Add category to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.NAME_COLUMN, name); - - int id = (int) db.insert(DbHelper.TABLE_CATEGORIES, null, contentValues); - Log.d(TAG, "created category with id = " + id); - - db.close(); - - return id; - } - - public void deleteCategoryById(int id) { - for (Category category : getCategories()) { - if (category.getId() == id) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_CATEGORIES, "id=?", new String[]{Integer.toString(id)}); - break; - } - } - } - - public String getCategoryById(int id) { - for (Category category : getCategories()) { - if (category.getId() == id) return category.getName(); - } + private IRepo categoryRepo; - return null; + public CategoryController(IRepo categoryRepo) { + this.categoryRepo = categoryRepo; } - public int getCategoryIdByName(String name) { - for (Category category : getCategories()) { - if (category.getName().equals(name)) return category.getId(); - } + public Category readOrCreate(String categoryName) { + String condition = DbHelper.NAME_COLUMN + "=?"; + String[] args = {categoryName}; + List categoryList = categoryRepo.readWithCondition(condition, args); - return -1; + if (categoryList.size() >= 1) return categoryList.get(0); + else return categoryRepo.create(new Category(categoryName)); } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index 57937a4..3ad04d0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -5,9 +5,12 @@ import android.database.sqlite.SQLiteDatabase; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import java.util.ArrayList; import java.util.List; @@ -21,12 +24,14 @@ public class RecordController { private DbHelper dbHelper; private AccountController accountController; + private final IRepo categoryRepo; private final CategoryController categoryController; public RecordController(DbHelper dbHelper) { this.dbHelper = dbHelper; this.accountController = new AccountController(new AccountRepo(dbHelper)); - categoryController = new CategoryController(dbHelper); + categoryRepo = new CategoryRepo(dbHelper); + categoryController = new CategoryController(categoryRepo); } public Record read(long id) { @@ -110,11 +115,7 @@ public List getRecords(Period period) { } public void addRecord(Record record) { - //Add category if it does not exist yet - if (categoryController.getCategoryIdByName(record.getCategory()) == -1) - categoryController.addCategory(record.getCategory()); - - record.setCategoryId(categoryController.getCategoryIdByName(record.getCategory())); + record.setCategoryId(categoryController.readOrCreate(record.getCategory()).getId()); //Add record to DB SQLiteDatabase db = dbHelper.getWritableDatabase(); @@ -135,14 +136,9 @@ public void addRecord(Record record) { } public void updateRecordById(int id, String title, String category, int price, int accountId) { - //Add category if it does not exist yet - if (categoryController.getCategoryIdByName(category) == -1) { - categoryController.addCategory(category); - } - Record oldRecord = read(id); - int categoryId = categoryController.getCategoryIdByName(category); + int categoryId = categoryController.readOrCreate(category).getId(); SQLiteDatabase db = dbHelper.getWritableDatabase(); @@ -216,7 +212,7 @@ public List getRecordsForExport(long fromDate, long toDate) { sb.append(id).append(DELIMITER); sb.append(time).append(DELIMITER); sb.append(title).append(DELIMITER); - sb.append(categoryController.getCategoryById(categoryId)).append(DELIMITER); + sb.append(categoryRepo.read(categoryId)).append(DELIMITER); sb.append(type == 0 ? price : -price); result.add(sb.toString()); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java index 3a9f3d1..9e0acc8 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java @@ -1,8 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.model; /** - * Entity class for account - * Created by evgenii on 6/3/15. + * Entity class for account. + * Created on 6/3/15. + * + * @author Evgenii Kanivets */ public class Account { private int id; diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java index 3828031..7d47821 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java @@ -1,7 +1,10 @@ package com.blogspot.e_kanivets.moneytracker.model; /** - * Created by eugene on 01/09/14. + * Entity class for account. + * Created on 01/09/14. + * + * @author Evgenii Kanivets */ public class Category { @@ -13,6 +16,11 @@ public Category(int id, String name) { this.name = name; } + public Category(String name) { + this.id = -1; + this.name = name; + } + public int getId() { return id; } @@ -20,4 +28,15 @@ public int getId() { public String getName() { return name; } -} + + @SuppressWarnings("StringBufferReplaceableByString") + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Category {"); + sb.append("id = ").append(id); + sb.append("}"); + + return sb.toString(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java index d32d41c..3ee2efb 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java @@ -1,8 +1,8 @@ package com.blogspot.e_kanivets.moneytracker.model; -import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.MtApp; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; import java.io.Serializable; @@ -32,7 +32,9 @@ public Record(int id, long time, int type, String title, int categoryId, int pri this.price = price; this.accountId = accountId; - category = new CategoryController(new DbHelper(MtApp.get())).getCategoryById(categoryId); + // TODO: Refactor this shit. + Category categoryActual = new CategoryRepo(new DbHelper(MtApp.get())).read(categoryId); + if (categoryActual != null) category = categoryActual.getName(); } public Record(long time, int type, String title, String category, int price, int accountId) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java index 82ba245..fec5e34 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java @@ -48,7 +48,7 @@ public Account create(Account account) { return null; } else { Account createdAccount = read(id); - Log.d(TAG, "Created account : " + account); + Log.d(TAG, "Created account : " + createdAccount); return createdAccount; } } @@ -56,14 +56,7 @@ public Account create(Account account) { @Nullable @Override public Account read(long id) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, "id=?", - new String[]{Long.toString(id)}, null, null, null); - List accountList = getAccountListFromCursor(cursor); - - cursor.close(); - db.close(); + List accountList = readWithCondition("id=?", new String[]{Long.toString(id)}); if (accountList.size() == 1) return accountList.get(0); else return null; @@ -76,6 +69,8 @@ public Account update(Account account) { ContentValues contentValues = new ContentValues(); contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); + contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); + contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); String[] args = new String[]{Integer.valueOf(account.getId()).toString()}; long rowsAffected = db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", args); @@ -86,8 +81,9 @@ public Account update(Account account) { Log.d(TAG, "Couldn't update account : " + account); return null; } else { - Log.d(TAG, "Updated account : " + account); - return read(account.getId()); + Account updatedAccount = read(account.getId()); + Log.d(TAG, "Updated account : " + updatedAccount); + return updatedAccount; } } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java new file mode 100644 index 0000000..0dfd88a --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java @@ -0,0 +1,140 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Category} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class CategoryRepo implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "CategoryRepo"; + + private DbHelper dbHelper; + + public CategoryRepo(DbHelper dbHelper) { + this.dbHelper = dbHelper; + } + + @Nullable + @Override + public Category create(Category category) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.NAME_COLUMN, category.getName()); + + long id = db.insert(DbHelper.TABLE_CATEGORIES, null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create category : " + category); + return null; + } else { + Category createdCategory = read(id); + Log.d(TAG, "Created account : " + createdCategory); + return createdCategory; + } + } + + @Nullable + @Override + public Category read(long id) { + List categoryList = readWithCondition("id=?", new String[]{Long.toString(id)}); + + if (categoryList.size() == 1) return categoryList.get(0); + else return null; + } + + @Nullable + @Override + public Category update(Category category) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.NAME_COLUMN, category.getName()); + + String[] args = new String[]{Integer.valueOf(category.getId()).toString()}; + long rowsAffected = db.update(DbHelper.TABLE_CATEGORIES, contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update category : " + category); + return null; + } else { + Category updatedCategory = read(category.getId()); + Log.d(TAG, "Updated category : " + updatedCategory); + return updatedCategory; + } + } + + @Override + public boolean delete(Category category) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Integer.toString(category.getId())}; + long rowsAffected = db.delete(DbHelper.TABLE_CATEGORIES, "id=?", args); + + db.close(); + + Log.d(TAG, category + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + //Read categories table from db + Cursor cursor = db.query(DbHelper.TABLE_CATEGORIES, null, condition, args, null, null, null); + List categoryList = getCategoryListFromCursor(cursor); + + cursor.close(); + db.close(); + + return categoryList; + } + + private List getCategoryListFromCursor(Cursor cursor) { + List categoryList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int nameColIndex = cursor.getColumnIndex(DbHelper.NAME_COLUMN); + + do { + //Read a record from DB + Category category = new Category(cursor.getInt(idColIndex), + cursor.getString(nameColIndex)); + + //Add record to list + categoryList.add(category); + } while (cursor.moveToNext()); + } + + return categoryList; + } +} \ No newline at end of file From 34e6010320fb342b7659ff7376c8d357b6db434a Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 16:33:16 +0200 Subject: [PATCH 08/10] #10[1h]. Refactor RecordController, add RecordRepo. --- .../activity/AddExpenseActivity.java | 11 +- .../activity/AddIncomeActivity.java | 11 +- .../moneytracker/activity/ReportActivity.java | 19 +- .../activity/base/AddRecordBaseActivity.java | 10 +- .../controller/RecordController.java | 196 ++---------------- .../moneytracker/fragment/ExportFragment.java | 17 +- .../fragment/RecordsFragment.java | 41 ++-- .../moneytracker/repo/RecordRepo.java | 173 ++++++++++++++++ 8 files changed, 276 insertions(+), 202 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java index 02b0c13..4c06230 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddExpenseActivity.java @@ -12,10 +12,15 @@ public class AddExpenseActivity extends AddRecordBaseActivity { @Override protected boolean doRecord(String title, String category, int price, Account account) { - if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(), + if (mode == Mode.MODE_ADD) recordRepo.create(new Record(new Date().getTime(), Record.TYPE_EXPENSE, title, category, price, account.getId())); - else if (mode == Mode.MODE_EDIT) - recordController.updateRecordById(record.getId(), title, category, price, account.getId()); + else if (mode == Mode.MODE_EDIT) { + record.setTitle(title); + record.setCategory(category); + record.setPrice(price); + record.setAccountId(account.getId()); + recordRepo.update(record); + } return true; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java index 4f131fa..208bd66 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/AddIncomeActivity.java @@ -12,10 +12,15 @@ public class AddIncomeActivity extends AddRecordBaseActivity { @Override protected boolean doRecord(String title, String category, int price, Account account) { - if (mode == Mode.MODE_ADD) recordController.addRecord(new Record(new Date().getTime(), + if (mode == Mode.MODE_ADD) recordRepo.create(new Record(new Date().getTime(), Record.TYPE_INCOME, title, category, price, account.getId())); - else if (mode == Mode.MODE_EDIT) recordController.updateRecordById(record.getId(), - title, category, price, account.getId()); + else if (mode == Mode.MODE_EDIT) { + record.setTitle(title); + record.setCategory(category); + record.setPrice(price); + record.setAccountId(account.getId()); + recordRepo.update(record); + } return true; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java index 7e59334..d7d0129 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/ReportActivity.java @@ -11,11 +11,18 @@ import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; import com.blogspot.e_kanivets.moneytracker.adapter.ExpandableListReportAdapter; import com.blogspot.e_kanivets.moneytracker.adapter.ReportItemAdapter; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.model.Report; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.util.Constants; import java.util.ArrayList; @@ -50,10 +57,16 @@ protected int getContentViewId() { protected boolean initData() { super.initData(); - recordController = new RecordController(new DbHelper(ReportActivity.this)); + DbHelper dbHelper = new DbHelper(ReportActivity.this); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + IRepo recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + recordController = new RecordController(recordRepo, categoryRepo); period = getIntent().getParcelableExtra(KEY_PERIOD); - report = new Report(recordController.getRecords(period)); + report = new Report(recordController.getRecordsForPeriod(period)); return period != null; } @@ -63,7 +76,7 @@ protected void initViews() { super.initViews(); listView.setAdapter(new ReportItemAdapter(ReportActivity.this, - new Report(recordController.getRecords(period)).getReportList())); + new Report(recordController.getRecordsForPeriod(period)).getReportList())); /* Scroll list to bottom only once at start */ listView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java index 9052a8e..00c6750 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/base/AddRecordBaseActivity.java @@ -8,12 +8,15 @@ import android.widget.Spinner; import com.blogspot.e_kanivets.moneytracker.R; -import com.blogspot.e_kanivets.moneytracker.controller.RecordController; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Record; import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import java.util.ArrayList; import java.util.List; @@ -40,7 +43,7 @@ public abstract class AddRecordBaseActivity extends BaseActivity { protected List accountList; protected IRepo accountRepo; - protected RecordController recordController; + protected IRepo recordRepo; @Bind(R.id.et_title) EditText etTitle; @@ -63,7 +66,8 @@ protected boolean initData() { DbHelper dbHelper = new DbHelper(AddRecordBaseActivity.this); accountRepo = new AccountRepo(dbHelper); - recordController = new RecordController(dbHelper); + recordRepo = new RecordRepo(dbHelper, new AccountController(accountRepo), + new CategoryController(new CategoryRepo(dbHelper))); record = (Record) getIntent().getSerializableExtra(KEY_RECORD); mode = (Mode) getIntent().getSerializableExtra(KEY_MODE); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java index 3ad04d0..71cb485 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/RecordController.java @@ -1,15 +1,9 @@ package com.blogspot.e_kanivets.moneytracker.controller; -import android.content.ContentValues; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; - import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; -import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; -import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; import com.blogspot.e_kanivets.moneytracker.repo.IRepo; import java.util.ArrayList; @@ -22,148 +16,20 @@ * @author Evgenii Kanivets */ public class RecordController { - private DbHelper dbHelper; - private AccountController accountController; private final IRepo categoryRepo; - private final CategoryController categoryController; + private final IRepo recordRepo; - public RecordController(DbHelper dbHelper) { - this.dbHelper = dbHelper; - this.accountController = new AccountController(new AccountRepo(dbHelper)); - categoryRepo = new CategoryRepo(dbHelper); - categoryController = new CategoryController(categoryRepo); + public RecordController(IRepo recordRepo, IRepo categoryRepo) { + this.recordRepo = recordRepo; + this.categoryRepo = categoryRepo; } - public Record read(long id) { - Record record = null; - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "id=?", - new String[]{Long.toString(id)}, null, null, null); - - if (cursor.moveToFirst()) { - //Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int timeColIndex = cursor.getColumnIndex(DbHelper.TIME_COLUMN); - int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); - int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); - int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); - - do { - //Read a record from DB - record = new Record(cursor.getInt(idColIndex), - cursor.getLong(timeColIndex), - cursor.getInt(typeColIndex), - cursor.getString(titleColIndex), - cursor.getInt(categoryColIndex), - cursor.getInt(priceColIndex), - cursor.getInt(accountIdColIndex)); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return record; - } - - public List getRecords(Period period) { - List recordList = new ArrayList<>(); - - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Form args to select only needed records according to period + public List getRecordsForPeriod(Period period) { + String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; String[] args = new String[]{Long.toString(period.getFirst().getTime()), Long.toString(period.getLast().getTime())}; - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "time BETWEEN ? AND ?", args, null, null, null); - - if (cursor.moveToFirst()) { - //Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int timeColIndex = cursor.getColumnIndex(DbHelper.TIME_COLUMN); - int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); - int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); - int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); - - do { - //Read a record from DB - Record record = new Record(cursor.getInt(idColIndex), - cursor.getLong(timeColIndex), - cursor.getInt(typeColIndex), - cursor.getString(titleColIndex), - cursor.getInt(categoryColIndex), - cursor.getInt(priceColIndex), - cursor.getInt(accountIdColIndex)); - - //Add record to list - recordList.add(record); - } while (cursor.moveToNext()); - } - - cursor.close(); - db.close(); - - return recordList; - } - - public void addRecord(Record record) { - record.setCategoryId(categoryController.readOrCreate(record.getCategory()).getId()); - - //Add record to DB - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TIME_COLUMN, record.getTime()); - contentValues.put(DbHelper.TYPE_COLUMN, record.getType()); - contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); - contentValues.put(DbHelper.CATEGORY_ID_COLUMN, record.getCategoryId()); - contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); - contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); - - db.insert(DbHelper.TABLE_RECORDS, null, contentValues); - - db.close(); - - accountController.recordAdded(record); - } - - public void updateRecordById(int id, String title, String category, int price, int accountId) { - Record oldRecord = read(id); - - int categoryId = categoryController.readOrCreate(category).getId(); - - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TITLE_COLUMN, title); - contentValues.put(DbHelper.CATEGORY_ID_COLUMN, categoryId); - contentValues.put(DbHelper.PRICE_COLUMN, price); - contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, accountId); - - db.update(DbHelper.TABLE_RECORDS, contentValues, "id=?", new String[]{Integer.valueOf(id).toString()}); - - db.close(); - - Record newRecord = read(id); - - accountController.recordUpdated(oldRecord, newRecord); - } - - public void deleteRecord(Record record) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - db.delete(DbHelper.TABLE_RECORDS, "id=?", - new String[]{Integer.toString(record.getId())}); - db.close(); - - accountController.recordDeleted(record); + return recordRepo.readWithCondition(condition, args); } public List getRecordsForExport(long fromDate, long toDate) { @@ -181,47 +47,23 @@ public List getRecordsForExport(long fromDate, long toDate) { result.add(sb.toString()); - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Form args to select only needed records according to period - String[] args = new String[]{Long.toString(fromDate), - Long.toString(toDate)}; - - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, "time BETWEEN ? AND ?", args, null, null, null); + String condition = DbHelper.TIME_COLUMN + " BETWEEN ? AND ?"; + String[] args = new String[]{Long.toString(fromDate), Long.toString(toDate)}; - if (cursor.moveToFirst()) { - //Get indexes of columns - int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); - int timeColIndex = cursor.getColumnIndex(DbHelper.TIME_COLUMN); - int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); - int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); - int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); - int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); + List recordList = recordRepo.readWithCondition(condition, args); - do { - //Read a record from DB - int id = cursor.getInt(idColIndex); - long time = cursor.getLong(timeColIndex); - int type = cursor.getInt(typeColIndex); - String title = cursor.getString(titleColIndex); - int categoryId = cursor.getInt(categoryColIndex); - int price = cursor.getInt(priceColIndex); + for (Record record : recordList) { + sb = new StringBuilder(); + sb.append(record.getId()).append(DELIMITER); + sb.append(record.getTime()).append(DELIMITER); + sb.append(record.getTitle()).append(DELIMITER); + Category category = categoryRepo.read(record.getCategoryId()); + sb.append(category == null ? "NONE" : category.getName()).append(DELIMITER); + sb.append(record.getType() == 0 ? record.getPrice() : -record.getPrice()); - sb = new StringBuilder(); - sb.append(id).append(DELIMITER); - sb.append(time).append(DELIMITER); - sb.append(title).append(DELIMITER); - sb.append(categoryRepo.read(categoryId)).append(DELIMITER); - sb.append(type == 0 ? price : -price); - - result.add(sb.toString()); - } while (cursor.moveToNext()); + result.add(sb.toString()); } - cursor.close(); - db.close(); - return result; } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java index e1a92ee..f555fca 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/ExportFragment.java @@ -12,8 +12,16 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; +import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.util.Constants; import java.io.File; @@ -67,7 +75,14 @@ private void initActionBar() { @OnClick(R.id.btn_export) public void exportRecords() { - RecordController recordController = new RecordController(new DbHelper(getActivity())); + DbHelper dbHelper = new DbHelper(getActivity()); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + IRepo recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + RecordController recordController = new RecordController(recordRepo, categoryRepo); + List records = recordController.getRecordsForExport(0, Long.MAX_VALUE); File outFile = new File(Environment.getExternalStorageDirectory(), Constants.DEFAULT_EXPORT_FILE_NAME); diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java index ee63d51..154298c 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/fragment/RecordsFragment.java @@ -27,17 +27,25 @@ import com.blogspot.e_kanivets.moneytracker.activity.NavDrawerActivity; import com.blogspot.e_kanivets.moneytracker.activity.ReportActivity; import com.blogspot.e_kanivets.moneytracker.adapter.RecordAdapter; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; import com.blogspot.e_kanivets.moneytracker.controller.PeriodController; import com.blogspot.e_kanivets.moneytracker.controller.RecordController; import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.Category; import com.blogspot.e_kanivets.moneytracker.model.Period; import com.blogspot.e_kanivets.moneytracker.model.Record; +import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; +import com.blogspot.e_kanivets.moneytracker.repo.CategoryRepo; +import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.RecordRepo; import com.blogspot.e_kanivets.moneytracker.ui.AppRateDialog; import com.blogspot.e_kanivets.moneytracker.ui.ChangeDateDialog; import com.blogspot.e_kanivets.moneytracker.util.PrefUtils; import java.util.Calendar; import java.util.Date; +import java.util.List; import butterknife.Bind; import butterknife.ButterKnife; @@ -53,6 +61,12 @@ public class RecordsFragment extends Fragment { private static final int REQUEST_ACTION_RECORD = 1; + List recordList; + + private IRepo recordRepo; + private RecordController recordController; + private PeriodController periodController; + @Bind(R.id.list_view) ListView listView; @Bind(R.id.tv_from_date) @@ -60,9 +74,6 @@ public class RecordsFragment extends Fragment { @Bind(R.id.tv_to_date) TextView tvToDate; - private RecordController recordController; - private PeriodController periodController; - public static RecordsFragment newInstance() { RecordsFragment fragment = new RecordsFragment(); Bundle args = new Bundle(); @@ -79,7 +90,14 @@ public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); periodController = new PeriodController(); - recordController = new RecordController(new DbHelper(getActivity())); + + DbHelper dbHelper = new DbHelper(getActivity()); + IRepo categoryRepo = new CategoryRepo(dbHelper); + CategoryController categoryController = new CategoryController(categoryRepo); + AccountController accountController = new AccountController(new AccountRepo(dbHelper)); + recordRepo = new RecordRepo(dbHelper, accountController, categoryController); + + recordController = new RecordController(recordRepo, categoryRepo); } @Override @@ -112,15 +130,13 @@ public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.edit: - Record record = recordController. - getRecords(periodController.getPeriod()).get(info.position); + Record record = recordList.get(info.position); if (record.isIncome()) startAddIncomeActivity(record, AddIncomeActivity.Mode.MODE_EDIT); else startAddExpenseActivity(record, AddExpenseActivity.Mode.MODE_EDIT); return true; case R.id.delete: - recordController.deleteRecord(recordController. - getRecords(periodController.getPeriod()).get(info.position)); + recordRepo.delete(recordList.get(info.position)); update(); return true; default: @@ -192,8 +208,8 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } private void update() { - listView.setAdapter(new RecordAdapter(getActivity(), - recordController.getRecords(periodController.getPeriod()))); + recordList = recordController.getRecordsForPeriod(periodController.getPeriod()); + listView.setAdapter(new RecordAdapter(getActivity(), recordList)); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); } @@ -205,8 +221,9 @@ private void initViews(View rootView) { tvFromDate.setText(periodController.getFirstDay()); tvToDate.setText(periodController.getLastDay()); - listView.setAdapter(new RecordAdapter(getActivity(), - recordController.getRecords(periodController.getPeriod()))); + recordList = recordController.getRecordsForPeriod(periodController.getPeriod()); + + listView.setAdapter(new RecordAdapter(getActivity(), recordList)); ((BaseAdapter) listView.getAdapter()).notifyDataSetChanged(); /* Scroll list to bottom only once at start */ diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java new file mode 100644 index 0000000..857bead --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java @@ -0,0 +1,173 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.controller.CategoryController; +import com.blogspot.e_kanivets.moneytracker.model.Record; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Record} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class RecordRepo implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "RecordRepo"; + + private final DbHelper dbHelper; + private final AccountController accountController; + private final CategoryController categoryController; + + public RecordRepo(DbHelper dbHelper, AccountController accountController, CategoryController categoryController) { + this.dbHelper = dbHelper; + this.accountController = accountController; + this.categoryController = categoryController; + } + + @Nullable + @Override + public Record create(Record record) { + record.setCategoryId(categoryController.readOrCreate(record.getCategory()).getId()); + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TIME_COLUMN, record.getTime()); + contentValues.put(DbHelper.TYPE_COLUMN, record.getType()); + contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); + contentValues.put(DbHelper.CATEGORY_ID_COLUMN, record.getCategoryId()); + contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); + contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); + + long id = db.insert(DbHelper.TABLE_RECORDS, null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create record : " + record); + return null; + } else { + Record createdRecord = read(id); + accountController.recordAdded(createdRecord); + Log.d(TAG, "Created record : " + createdRecord); + + return createdRecord; + } + } + + @Nullable + @Override + public Record read(long id) { + List recordList = readWithCondition("id=?", new String[]{Long.toString(id)}); + + if (recordList.size() == 1) return recordList.get(0); + else return null; + } + + @Nullable + @Override + public Record update(Record record) { + Record oldRecord = read(record.getId()); + + int categoryId = categoryController.readOrCreate(record.getCategory()).getId(); + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TITLE_COLUMN, record.getTitle()); + contentValues.put(DbHelper.CATEGORY_ID_COLUMN, categoryId); + contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); + contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); + + String[] args = {Integer.valueOf(record.getId()).toString()}; + long rowsAffected = db.update(DbHelper.TABLE_RECORDS, contentValues, "id=?", args); + + db.close(); + + if (rowsAffected == 0) { + Log.d(TAG, "Couldn't update record : " + record); + return null; + } else { + Record updatedRecord = read(record.getId()); + accountController.recordUpdated(oldRecord, updatedRecord); + + Log.d(TAG, "Updated record : " + updatedRecord); + return updatedRecord; + } + } + + @Override + public boolean delete(Record record) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Integer.toString(record.getId())}; + long rowsAffected = db.delete(DbHelper.TABLE_RECORDS, "id=?", args); + db.close(); + + accountController.recordDeleted(record); + + Log.d(TAG, record + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + //Read records table from db + Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, condition, args, null, null, null); + List recordList = getRecordListFromCursor(cursor); + + cursor.close(); + db.close(); + + return recordList; + } + + private List getRecordListFromCursor(Cursor cursor) { + List recordList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int timeColIndex = cursor.getColumnIndex(DbHelper.TIME_COLUMN); + int typeColIndex = cursor.getColumnIndex(DbHelper.TYPE_COLUMN); + int titleColIndex = cursor.getColumnIndex(DbHelper.TITLE_COLUMN); + int categoryColIndex = cursor.getColumnIndex(DbHelper.CATEGORY_ID_COLUMN); + int priceColIndex = cursor.getColumnIndex(DbHelper.PRICE_COLUMN); + int accountIdColIndex = cursor.getColumnIndex(DbHelper.ACCOUNT_ID_COLUMN); + + do { + Record record = new Record(cursor.getInt(idColIndex), + cursor.getLong(timeColIndex), + cursor.getInt(typeColIndex), + cursor.getString(titleColIndex), + cursor.getInt(categoryColIndex), + cursor.getInt(priceColIndex), + cursor.getInt(accountIdColIndex)); + + recordList.add(record); + } while (cursor.moveToNext()); + } + + return recordList; + } +} \ No newline at end of file From efd4dc32d511246c80ab987776dd0e766b602eb2 Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 17:07:56 +0200 Subject: [PATCH 09/10] #10[30m]. Remove TransferController, add TransferRepo. --- .../e_kanivets/moneytracker/DbHelper.java | 4 +- .../activity/TransferActivity.java | 8 +- .../controller/TransferController.java | 48 ------- .../moneytracker/repo/TransferRepo.java | 133 ++++++++++++++++++ 4 files changed, 139 insertions(+), 54 deletions(-) delete mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java index 731745e..d3002f9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/DbHelper.java @@ -38,7 +38,7 @@ public class DbHelper extends SQLiteOpenHelper { public static final String TABLE_TRANSFERS = "transfers"; public static final String FROM_ACCOUNT_ID_COLUMN = "from_account_id"; - public static final String TO_ACCOUND_ID_COLUMN = "to_account_id"; + public static final String TO_ACCOUNT_ID_COLUMN = "to_account_id"; public static final String FROM_AMOUNT_COLUMN = "from_amount"; public static final String TO_AMOUNT_COLUMN = "to_amount"; public static final String CREATED_AT_COLUMN = "created_at"; @@ -129,7 +129,7 @@ private void createTransfersTable(SQLiteDatabase db) { + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," + TIME_COLUMN + " INTEGER," + FROM_ACCOUNT_ID_COLUMN + " INTEGER," - + TO_ACCOUND_ID_COLUMN + " INTEGER," + + TO_ACCOUNT_ID_COLUMN + " INTEGER," + FROM_AMOUNT_COLUMN + " INTEGER," + TO_AMOUNT_COLUMN + " INTEGER);"); } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java index d25a28b..e8056ea 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/activity/TransferActivity.java @@ -9,12 +9,12 @@ import com.blogspot.e_kanivets.moneytracker.R; import com.blogspot.e_kanivets.moneytracker.activity.base.BaseActivity; import com.blogspot.e_kanivets.moneytracker.controller.AccountController; -import com.blogspot.e_kanivets.moneytracker.controller.TransferController; import com.blogspot.e_kanivets.moneytracker.DbHelper; import com.blogspot.e_kanivets.moneytracker.model.Account; import com.blogspot.e_kanivets.moneytracker.model.Transfer; import com.blogspot.e_kanivets.moneytracker.repo.AccountRepo; import com.blogspot.e_kanivets.moneytracker.repo.IRepo; +import com.blogspot.e_kanivets.moneytracker.repo.TransferRepo; import java.util.ArrayList; import java.util.List; @@ -25,7 +25,7 @@ public class TransferActivity extends BaseActivity { @SuppressWarnings("unused") private static final String TAG = "TransferActivity"; - private TransferController transferController; + private IRepo transferRepo; private List accountList; @@ -49,7 +49,7 @@ protected boolean initData() { IRepo accountRepo = new AccountRepo(dbHelper); AccountController accountController = new AccountController(accountRepo); - transferController = new TransferController(dbHelper, accountController); + transferRepo = new TransferRepo(dbHelper, accountController); accountList = accountRepo.readAll(); @@ -117,6 +117,6 @@ private void doTransfer() { Transfer transfer = new Transfer(System.currentTimeMillis(), fromAccount.getId(), toAccount.getId(), fromAmount, toAmount); - transferController.create(transfer); + transferRepo.create(transfer); } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java deleted file mode 100644 index 7c8995b..0000000 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/controller/TransferController.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.blogspot.e_kanivets.moneytracker.controller; - -import android.content.ContentValues; -import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.Nullable; -import android.util.Log; - -import com.blogspot.e_kanivets.moneytracker.DbHelper; -import com.blogspot.e_kanivets.moneytracker.model.Transfer; - -/** - * Controller class to encapsulate transfer handling logic. - * Created by evgenii_kanivets on 2/10/16. - */ -public class TransferController { - @SuppressWarnings("unused") - private static final String TAG = "TransferController"; - - private DbHelper dbHelper; - private AccountController accountController; - - public TransferController(DbHelper dbHelper, AccountController accountController) { - this.dbHelper = dbHelper; - this.accountController = accountController; - } - - public boolean create(@Nullable Transfer transfer) { - if (transfer == null) return false; - - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - ContentValues contentValues = new ContentValues(); - contentValues.put(DbHelper.TIME_COLUMN, transfer.getTime()); - contentValues.put(DbHelper.FROM_ACCOUNT_ID_COLUMN, transfer.getFromAccountId()); - contentValues.put(DbHelper.TO_ACCOUND_ID_COLUMN, transfer.getToAccountId()); - contentValues.put(DbHelper.FROM_AMOUNT_COLUMN, transfer.getFromAmount()); - contentValues.put(DbHelper.TO_AMOUNT_COLUMN, transfer.getToAmount()); - - long id = db.insert(DbHelper.TABLE_TRANSFERS, null, contentValues); - Log.d(TAG, "created transfer with id = " + id); - - db.close(); - - accountController.transferDone(transfer); - - return true; - } -} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java new file mode 100644 index 0000000..aff0243 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java @@ -0,0 +1,133 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.content.ContentValues; +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.controller.AccountController; +import com.blogspot.e_kanivets.moneytracker.model.Transfer; + +import java.util.ArrayList; +import java.util.List; + +/** + * {@link IRepo} implementation for {@link Transfer} entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public class TransferRepo implements IRepo { + @SuppressWarnings("unused") + private static final String TAG = "TransferRepo"; + + private DbHelper dbHelper; + private AccountController accountController; + + public TransferRepo(DbHelper dbHelper, AccountController accountController) { + this.dbHelper = dbHelper; + this.accountController = accountController; + } + + @Nullable + @Override + public Transfer create(Transfer transfer) { + if (transfer == null) return null; + + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + ContentValues contentValues = new ContentValues(); + contentValues.put(DbHelper.TIME_COLUMN, transfer.getTime()); + contentValues.put(DbHelper.FROM_ACCOUNT_ID_COLUMN, transfer.getFromAccountId()); + contentValues.put(DbHelper.TO_ACCOUNT_ID_COLUMN, transfer.getToAccountId()); + contentValues.put(DbHelper.FROM_AMOUNT_COLUMN, transfer.getFromAmount()); + contentValues.put(DbHelper.TO_AMOUNT_COLUMN, transfer.getToAmount()); + + long id = db.insert(DbHelper.TABLE_TRANSFERS, null, contentValues); + + db.close(); + + if (id == -1) { + Log.d(TAG, "Couldn't create transfer : " + transfer); + return null; + } else { + Transfer createdTransfer = read(id); + accountController.transferDone(transfer); + Log.d(TAG, "Created transfer : " + createdTransfer); + + return createdTransfer; + } + } + + @Nullable + @Override + public Transfer read(long id) { + List transferList = readWithCondition("id=?", new String[]{Long.toString(id)}); + + if (transferList.size() == 1) return transferList.get(0); + else return null; + } + + @Nullable + @Override + public Transfer update(Transfer instance) { + throw new IllegalStateException("Not implemented yet"); + } + + @Override + public boolean delete(Transfer instance) { + throw new IllegalStateException("Not implemented yet"); + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(DbHelper.TABLE_TRANSFERS, null, condition, args, null, null, null); + List accountList = getTransferListFromCursor(cursor); + + cursor.close(); + db.close(); + + return accountList; + } + + private List getTransferListFromCursor(Cursor cursor) { + List accountList = new ArrayList<>(); + + if (cursor.moveToFirst()) { + // Get indexes of columns + int idColIndex = cursor.getColumnIndex(DbHelper.ID_COLUMN); + int idColTime = cursor.getColumnIndex(DbHelper.TIME_COLUMN); + int idColFromAccountId = cursor.getColumnIndex(DbHelper.FROM_ACCOUNT_ID_COLUMN); + int idColToAccountId = cursor.getColumnIndex(DbHelper.TO_ACCOUNT_ID_COLUMN); + int idColFromAmount = cursor.getColumnIndex(DbHelper.FROM_AMOUNT_COLUMN); + int idColToAmount = cursor.getColumnIndex(DbHelper.TO_AMOUNT_COLUMN); + + do { + // Read a account from DB + Transfer account = new Transfer(cursor.getInt(idColIndex), + cursor.getLong(idColTime), + cursor.getLong(idColFromAccountId), + cursor.getLong(idColToAccountId), + cursor.getInt(idColFromAmount), + cursor.getInt(idColToAmount)); + + accountList.add(account); + } while (cursor.moveToNext()); + } + + return accountList; + } +} \ No newline at end of file From 257fcba59582f3f442bdcc2a4a96ed3de43c16ad Mon Sep 17 00:00:00 2001 From: Evgenii Kanivets Date: Mon, 15 Feb 2016 17:59:25 +0200 Subject: [PATCH 10/10] #10[1h]. Add BaseRepo, IEntity. --- .../moneytracker/model/Account.java | 11 +-- .../moneytracker/model/Category.java | 9 ++- .../moneytracker/model/IEntity.java | 11 +++ .../e_kanivets/moneytracker/model/Record.java | 23 +++--- .../moneytracker/model/Transfer.java | 10 +-- .../moneytracker/repo/AccountRepo.java | 60 +++------------ .../moneytracker/repo/BaseRepo.java | 76 +++++++++++++++++++ .../moneytracker/repo/CategoryRepo.java | 60 +++------------ .../moneytracker/repo/RecordRepo.java | 59 ++++---------- .../moneytracker/repo/TransferRepo.java | 46 +++-------- 10 files changed, 157 insertions(+), 208 deletions(-) create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java create mode 100644 app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java index 9e0acc8..68a28a2 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Account.java @@ -6,13 +6,13 @@ * * @author Evgenii Kanivets */ -public class Account { - private int id; +public class Account implements IEntity { + private long id; private String title; private int curSum; private String currency; - public Account(int id, String title, int curSum, String currency) { + public Account(long id, String title, int curSum, String currency) { this.id = id; this.title = title; this.curSum = curSum; @@ -26,7 +26,8 @@ public Account(String title, int curSum, String currency) { this.currency = currency; } - public int getId() { + @Override + public long getId() { return id; } @@ -81,4 +82,4 @@ public boolean equals(Object o) { return false; } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java index 7d47821..bf77459 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Category.java @@ -6,12 +6,12 @@ * * @author Evgenii Kanivets */ -public class Category { +public class Category implements IEntity { - private int id; + private long id; private String name; - public Category(int id, String name) { + public Category(long id, String name) { this.id = id; this.name = name; } @@ -21,7 +21,8 @@ public Category(String name) { this.name = name; } - public int getId() { + @Override + public long getId() { return id; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java new file mode 100644 index 0000000..3512724 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/IEntity.java @@ -0,0 +1,11 @@ +package com.blogspot.e_kanivets.moneytracker.model; + +/** + * Interface to represent contract of abstract entity. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public interface IEntity { + long getId(); +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java index 3ee2efb..282997d 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Record.java @@ -10,20 +10,20 @@ * Entity class. * Created by eugene on 01/09/14. */ -public class Record implements Serializable { +public class Record implements IEntity, Serializable { public static final int TYPE_INCOME = 0; public static final int TYPE_EXPENSE = 1; - private int id; + private long id; private long time; private int type; private String title; - private int categoryId; + private long categoryId; private String category; private int price; - private int accountId; + private long accountId; - public Record(int id, long time, int type, String title, int categoryId, int price, int accountId) { + public Record(long id, long time, int type, String title, long categoryId, int price, long accountId) { this.id = id; this.time = time; this.type = type; @@ -37,7 +37,7 @@ public Record(int id, long time, int type, String title, int categoryId, int pri if (categoryActual != null) category = categoryActual.getName(); } - public Record(long time, int type, String title, String category, int price, int accountId) { + public Record(long time, int type, String title, String category, int price, long accountId) { this.time = time; this.type = type; this.title = title; @@ -51,7 +51,8 @@ public int getType() { return type; } - public int getId() { + @Override + public long getId() { return id; } @@ -63,7 +64,7 @@ public String getCategory() { return category; } - public int getCategoryId() { + public long getCategoryId() { return categoryId; } @@ -83,7 +84,7 @@ public void setTitle(String title) { this.title = title; } - public void setCategoryId(int categoryId) { + public void setCategoryId(long categoryId) { this.categoryId = categoryId; } @@ -95,11 +96,11 @@ public void setPrice(int price) { this.price = price; } - public int getAccountId() { + public long getAccountId() { return accountId; } - public void setAccountId(int accountId) { + public void setAccountId(long accountId) { this.accountId = accountId; } } \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java index c7f5b3a..dbcc9f6 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/model/Transfer.java @@ -5,15 +5,8 @@ * Created on 2/10/16. * * @author Evgenii Kanivets - * - * + ID_COLUMN + " INTEGER PRIMARY KEY AUTOINCREMENT," -+ TIME_COLUMN + " INTEGER," -+ FROM_ACCOUNT_ID_COLUMN + " INTEGER," -+ TO_ACCOUND_ID_COLUMN + " INTEGER," -+ FROM_AMOUNT_COLUMN + " INTEGER," -+ TO_AMOUNT_COLUMN + " INTEGER);"); */ -public class Transfer { +public class Transfer implements IEntity { private long id; private long time; private long fromAccountId; @@ -38,6 +31,7 @@ public Transfer(long time, long fromAccountId, long toAccountId, int fromAmount, this.toAmount = toAmount; } + @Override public long getId() { return id; } diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java index fec5e34..58546fe 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/AccountRepo.java @@ -3,7 +3,6 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -19,16 +18,22 @@ * * @author Evgenii Kanivets */ -public class AccountRepo implements IRepo { +public class AccountRepo extends BaseRepo { @SuppressWarnings("unused") private static final String TAG = "AccountRepo"; private DbHelper dbHelper; public AccountRepo(DbHelper dbHelper) { + super(dbHelper); this.dbHelper = dbHelper; } + @Override + protected String getTable() { + return DbHelper.TABLE_ACCOUNTS; + } + @Nullable @Override public Account create(Account account) { @@ -39,7 +44,7 @@ public Account create(Account account) { contentValues.put(DbHelper.CUR_SUM_COLUMN, account.getCurSum()); contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); - long id = db.insert(DbHelper.TABLE_ACCOUNTS, null, contentValues); + long id = db.insert(getTable(), null, contentValues); db.close(); @@ -53,15 +58,6 @@ public Account create(Account account) { } } - @Nullable - @Override - public Account read(long id) { - List accountList = readWithCondition("id=?", new String[]{Long.toString(id)}); - - if (accountList.size() == 1) return accountList.get(0); - else return null; - } - @Nullable @Override public Account update(Account account) { @@ -72,8 +68,8 @@ public Account update(Account account) { contentValues.put(DbHelper.TITLE_COLUMN, account.getTitle()); contentValues.put(DbHelper.CURRENCY_COLUMN, account.getCurrency()); - String[] args = new String[]{Integer.valueOf(account.getId()).toString()}; - long rowsAffected = db.update(DbHelper.TABLE_ACCOUNTS, contentValues, "id=?", args); + String[] args = new String[]{Long.valueOf(account.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); db.close(); @@ -88,41 +84,7 @@ public Account update(Account account) { } @Override - public boolean delete(Account account) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - String[] args = new String[]{Integer.toString(account.getId())}; - long rowsAffected = db.delete(DbHelper.TABLE_ACCOUNTS, "id=?", args); - - db.close(); - - Log.d(TAG, account + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); - - return rowsAffected != 0; - } - - @NonNull - @Override - public List readAll() { - return readWithCondition(null, null); - } - - @NonNull - @Override - public List readWithCondition(String condition, String[] args) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_ACCOUNTS, null, condition, args, null, null, null); - List accountList = getAccountListFromCursor(cursor); - - cursor.close(); - db.close(); - - return accountList; - } - - private List getAccountListFromCursor(Cursor cursor) { + protected List getListFromCursor(Cursor cursor) { List accountList = new ArrayList<>(); if (cursor.moveToFirst()) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java new file mode 100644 index 0000000..7bc2791 --- /dev/null +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/BaseRepo.java @@ -0,0 +1,76 @@ +package com.blogspot.e_kanivets.moneytracker.repo; + +import android.database.Cursor; +import android.database.sqlite.SQLiteDatabase; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.Log; + +import com.blogspot.e_kanivets.moneytracker.DbHelper; +import com.blogspot.e_kanivets.moneytracker.model.IEntity; + +import java.util.List; + +/** + * Base implementation of {@link IRepo}. + * Created on 2/15/16. + * + * @author Evgenii Kanivets + */ +public abstract class BaseRepo implements IRepo { + private static final String TAG = "BaseRepo"; + + protected DbHelper dbHelper; + + public BaseRepo(DbHelper dbHelper) { + this.dbHelper = dbHelper; + } + + abstract String getTable(); + + abstract List getListFromCursor(Cursor cursor); + + @Nullable + @Override + public T read(long id) { + List list = readWithCondition("id=?", new String[]{Long.toString(id)}); + + if (list.size() == 1) return list.get(0); + else return null; + } + + @NonNull + @Override + public List readAll() { + return readWithCondition(null, null); + } + + @Override + public boolean delete(T instance) { + SQLiteDatabase db = dbHelper.getWritableDatabase(); + + String[] args = new String[]{Long.toString(instance.getId())}; + long rowsAffected = db.delete(getTable(), "id=?", args); + + db.close(); + + Log.d(TAG, instance + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); + + return rowsAffected != 0; + } + + @NonNull + @Override + public List readWithCondition(String condition, String[] args) { + SQLiteDatabase db = dbHelper.getReadableDatabase(); + + // Read accounts table from db + Cursor cursor = db.query(getTable(), null, condition, args, null, null, null); + List accountList = getListFromCursor(cursor); + + cursor.close(); + db.close(); + + return accountList; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java index 0dfd88a..00a6edb 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/CategoryRepo.java @@ -3,7 +3,6 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -19,16 +18,22 @@ * * @author Evgenii Kanivets */ -public class CategoryRepo implements IRepo { +public class CategoryRepo extends BaseRepo { @SuppressWarnings("unused") private static final String TAG = "CategoryRepo"; private DbHelper dbHelper; public CategoryRepo(DbHelper dbHelper) { + super(dbHelper); this.dbHelper = dbHelper; } + @Override + protected String getTable() { + return DbHelper.TABLE_CATEGORIES; + } + @Nullable @Override public Category create(Category category) { @@ -37,7 +42,7 @@ public Category create(Category category) { ContentValues contentValues = new ContentValues(); contentValues.put(DbHelper.NAME_COLUMN, category.getName()); - long id = db.insert(DbHelper.TABLE_CATEGORIES, null, contentValues); + long id = db.insert(getTable(), null, contentValues); db.close(); @@ -51,15 +56,6 @@ public Category create(Category category) { } } - @Nullable - @Override - public Category read(long id) { - List categoryList = readWithCondition("id=?", new String[]{Long.toString(id)}); - - if (categoryList.size() == 1) return categoryList.get(0); - else return null; - } - @Nullable @Override public Category update(Category category) { @@ -68,8 +64,8 @@ public Category update(Category category) { ContentValues contentValues = new ContentValues(); contentValues.put(DbHelper.NAME_COLUMN, category.getName()); - String[] args = new String[]{Integer.valueOf(category.getId()).toString()}; - long rowsAffected = db.update(DbHelper.TABLE_CATEGORIES, contentValues, "id=?", args); + String[] args = new String[]{Long.valueOf(category.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); db.close(); @@ -84,41 +80,7 @@ public Category update(Category category) { } @Override - public boolean delete(Category category) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - String[] args = new String[]{Integer.toString(category.getId())}; - long rowsAffected = db.delete(DbHelper.TABLE_CATEGORIES, "id=?", args); - - db.close(); - - Log.d(TAG, category + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); - - return rowsAffected != 0; - } - - @NonNull - @Override - public List readAll() { - return readWithCondition(null, null); - } - - @NonNull - @Override - public List readWithCondition(String condition, String[] args) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Read categories table from db - Cursor cursor = db.query(DbHelper.TABLE_CATEGORIES, null, condition, args, null, null, null); - List categoryList = getCategoryListFromCursor(cursor); - - cursor.close(); - db.close(); - - return categoryList; - } - - private List getCategoryListFromCursor(Cursor cursor) { + protected List getListFromCursor(Cursor cursor) { List categoryList = new ArrayList<>(); if (cursor.moveToFirst()) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java index 857bead..59fbff0 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/RecordRepo.java @@ -3,7 +3,6 @@ import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; @@ -21,7 +20,7 @@ * * @author Evgenii Kanivets */ -public class RecordRepo implements IRepo { +public class RecordRepo extends BaseRepo { @SuppressWarnings("unused") private static final String TAG = "RecordRepo"; @@ -30,11 +29,17 @@ public class RecordRepo implements IRepo { private final CategoryController categoryController; public RecordRepo(DbHelper dbHelper, AccountController accountController, CategoryController categoryController) { + super(dbHelper); this.dbHelper = dbHelper; this.accountController = accountController; this.categoryController = categoryController; } + @Override + protected String getTable() { + return DbHelper.TABLE_RECORDS; + } + @Nullable @Override public Record create(Record record) { @@ -50,7 +55,7 @@ public Record create(Record record) { contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); - long id = db.insert(DbHelper.TABLE_RECORDS, null, contentValues); + long id = db.insert(getTable(), null, contentValues); db.close(); @@ -66,21 +71,12 @@ public Record create(Record record) { } } - @Nullable - @Override - public Record read(long id) { - List recordList = readWithCondition("id=?", new String[]{Long.toString(id)}); - - if (recordList.size() == 1) return recordList.get(0); - else return null; - } - @Nullable @Override public Record update(Record record) { Record oldRecord = read(record.getId()); - int categoryId = categoryController.readOrCreate(record.getCategory()).getId(); + long categoryId = categoryController.readOrCreate(record.getCategory()).getId(); SQLiteDatabase db = dbHelper.getWritableDatabase(); @@ -90,8 +86,8 @@ public Record update(Record record) { contentValues.put(DbHelper.PRICE_COLUMN, record.getPrice()); contentValues.put(DbHelper.ACCOUNT_ID_COLUMN, record.getAccountId()); - String[] args = {Integer.valueOf(record.getId()).toString()}; - long rowsAffected = db.update(DbHelper.TABLE_RECORDS, contentValues, "id=?", args); + String[] args = {Long.valueOf(record.getId()).toString()}; + long rowsAffected = db.update(getTable(), contentValues, "id=?", args); db.close(); @@ -109,41 +105,14 @@ public Record update(Record record) { @Override public boolean delete(Record record) { - SQLiteDatabase db = dbHelper.getWritableDatabase(); - - String[] args = new String[]{Integer.toString(record.getId())}; - long rowsAffected = db.delete(DbHelper.TABLE_RECORDS, "id=?", args); - db.close(); - + boolean result = super.delete(record); accountController.recordDeleted(record); - Log.d(TAG, record + (rowsAffected == 0 ? " didn't " : " ") + "deleted"); - - return rowsAffected != 0; - } - - @NonNull - @Override - public List readAll() { - return readWithCondition(null, null); + return result; } - @NonNull @Override - public List readWithCondition(String condition, String[] args) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - //Read records table from db - Cursor cursor = db.query(DbHelper.TABLE_RECORDS, null, condition, args, null, null, null); - List recordList = getRecordListFromCursor(cursor); - - cursor.close(); - db.close(); - - return recordList; - } - - private List getRecordListFromCursor(Cursor cursor) { + protected List getListFromCursor(Cursor cursor) { List recordList = new ArrayList<>(); if (cursor.moveToFirst()) { diff --git a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java index aff0243..64f09f9 100644 --- a/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java +++ b/app/src/main/java/com/blogspot/e_kanivets/moneytracker/repo/TransferRepo.java @@ -20,7 +20,7 @@ * * @author Evgenii Kanivets */ -public class TransferRepo implements IRepo { +public class TransferRepo extends BaseRepo { @SuppressWarnings("unused") private static final String TAG = "TransferRepo"; @@ -28,10 +28,16 @@ public class TransferRepo implements IRepo { private AccountController accountController; public TransferRepo(DbHelper dbHelper, AccountController accountController) { + super(dbHelper); this.dbHelper = dbHelper; this.accountController = accountController; } + @Override + protected String getTable() { + return DbHelper.TABLE_TRANSFERS; + } + @Nullable @Override public Transfer create(Transfer transfer) { @@ -46,7 +52,7 @@ public Transfer create(Transfer transfer) { contentValues.put(DbHelper.FROM_AMOUNT_COLUMN, transfer.getFromAmount()); contentValues.put(DbHelper.TO_AMOUNT_COLUMN, transfer.getToAmount()); - long id = db.insert(DbHelper.TABLE_TRANSFERS, null, contentValues); + long id = db.insert(getTable(), null, contentValues); db.close(); @@ -62,15 +68,6 @@ public Transfer create(Transfer transfer) { } } - @Nullable - @Override - public Transfer read(long id) { - List transferList = readWithCondition("id=?", new String[]{Long.toString(id)}); - - if (transferList.size() == 1) return transferList.get(0); - else return null; - } - @Nullable @Override public Transfer update(Transfer instance) { @@ -78,32 +75,7 @@ public Transfer update(Transfer instance) { } @Override - public boolean delete(Transfer instance) { - throw new IllegalStateException("Not implemented yet"); - } - - @NonNull - @Override - public List readAll() { - return readWithCondition(null, null); - } - - @NonNull - @Override - public List readWithCondition(String condition, String[] args) { - SQLiteDatabase db = dbHelper.getReadableDatabase(); - - // Read accounts table from db - Cursor cursor = db.query(DbHelper.TABLE_TRANSFERS, null, condition, args, null, null, null); - List accountList = getTransferListFromCursor(cursor); - - cursor.close(); - db.close(); - - return accountList; - } - - private List getTransferListFromCursor(Cursor cursor) { + protected List getListFromCursor(Cursor cursor) { List accountList = new ArrayList<>(); if (cursor.moveToFirst()) {