From 3a3e22991c6e4666eb5c800bfd49ee7c271b5a32 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Apr 2021 23:37:14 +0300 Subject: [PATCH] rewrite update of transaction list from DB with Room --- .../async/TransactionAccumulator.java | 5 +- .../async/UpdateTransactionsTask.java | 51 +++++++++---------- .../ktnx/mobileledger/dao/TransactionDAO.java | 24 ++++++--- 3 files changed, 43 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/async/TransactionAccumulator.java b/app/src/main/java/net/ktnx/mobileledger/async/TransactionAccumulator.java index 89fa2edd..eb8376f0 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/TransactionAccumulator.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/TransactionAccumulator.java @@ -1,5 +1,5 @@ /* - * Copyright © 2020 Damyan Ivanov. + * Copyright © 2021 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -35,6 +35,9 @@ public class TransactionAccumulator { list.add(new TransactionListItem()); // head item } + public void put(LedgerTransaction transaction) { + put(transaction, transaction.getDate()); + } public void put(LedgerTransaction transaction, SimpleDate date) { if (done) throw new IllegalStateException("Can't put new items after done()"); diff --git a/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java index 06bec67e..11de6a91 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/UpdateTransactionsTask.java @@ -17,57 +17,52 @@ package net.ktnx.mobileledger.async; -import android.database.Cursor; -import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; -import net.ktnx.mobileledger.App; +import net.ktnx.mobileledger.db.DB; import net.ktnx.mobileledger.db.Profile; +import net.ktnx.mobileledger.db.TransactionWithAccounts; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.ui.MainModel; -import net.ktnx.mobileledger.utils.SimpleDate; +import net.ktnx.mobileledger.utils.Logger; + +import java.util.List; import static net.ktnx.mobileledger.utils.Logger.debug; public class UpdateTransactionsTask extends AsyncTask { - protected String doInBackground(MainModel[] model) { + protected String doInBackground(MainModel[] parentModel) { final Profile profile = Data.getProfile(); long profile_id = profile.getId(); Data.backgroundTaskStarted(); try { - String sql; - String[] params; + Logger.debug("UTT", "Starting DB transaction list retrieval"); - final String accFilter = model[0].getAccountFilter() - .getValue(); - if (accFilter == null) { - sql = "SELECT id, year, month, day FROM transactions WHERE profile_id=? ORDER BY " + - "year desc, month desc, day desc, id desc"; - params = new String[]{String.valueOf(profile_id)}; + final MainModel model = parentModel[0]; + final String accFilter = model.getAccountFilter() + .getValue(); + final List transactions; + if (accFilter == null) { + transactions = DB.get() + .getTransactionDAO() + .getAllWithAccountsSync(profile_id); } else { - sql = "SELECT distinct tr.id, tr.year, tr.month, tr.day from transactions tr " + - "JOIN transaction_accounts ta ON ta.transaction_id=tr.id WHERE tr" + - ".profile_id=? and ta.account_name LIKE ?||'%' AND ta.amount <> 0 ORDER " + - "BY tr.year desc, tr.month desc, tr.day desc, tr.id " + "desc"; - params = new String[]{String.valueOf(profile_id), accFilter}; + transactions = DB.get() + .getTransactionDAO() + .getAllWithAccountsFilteredSync(profile_id, accFilter); } - debug("UTT", sql); - TransactionAccumulator accumulator = new TransactionAccumulator(model[0]); + TransactionAccumulator accumulator = new TransactionAccumulator(model); - SQLiteDatabase db = App.getDatabase(); - try (Cursor cursor = db.rawQuery(sql, params)) { - while (cursor.moveToNext()) { - if (isCancelled()) - return null; + for (TransactionWithAccounts tr : transactions) { + if (isCancelled()) + return null; - accumulator.put(new LedgerTransaction(cursor.getInt(0)), - new SimpleDate(cursor.getInt(1), cursor.getInt(2), cursor.getInt(3))); - } + accumulator.put(new LedgerTransaction(tr)); } accumulator.done(); diff --git a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java index c03da12b..03f43533 100644 --- a/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java +++ b/app/src/main/java/net/ktnx/mobileledger/dao/TransactionDAO.java @@ -55,13 +55,6 @@ public abstract class TransactionDAO extends BaseDAO { @Delete public abstract void deleteSync(List items); - @Query("SELECT * FROM transactions") - public abstract LiveData> getAll(); - - // not useful for now -// @Transaction -// @Query("SELECT * FROM patterns") -// List getPatternsWithAccounts(); @Query("SELECT * FROM transactions WHERE id = :id") public abstract LiveData getById(long id); @@ -93,11 +86,26 @@ public abstract class TransactionDAO extends BaseDAO { public abstract TransactionWithAccounts getFirstByDescriptionHavingAccountSync( @NonNull String description, @NonNull String accountTerm); - @Query("SELECT * from transactions WHERE profile_id = :profileId") + @Query("SELECT * from transactions WHERE profile_id = :profileId ORDER BY " + + "year desc, month desc, day desc, id desc") public abstract List allForProfileSync(long profileId); @Query("SELECT generation FROM transactions WHERE profile_id = :profileId LIMIT 1") protected abstract TransactionGenerationContainer getGenerationPOJOSync(long profileId); + + @androidx.room.Transaction + @Query("SELECT * FROM transactions WHERE profile_id = :profileId") + public abstract List getAllWithAccountsSync(long profileId); + + @androidx.room.Transaction + @Query("SELECT distinct(tr.id), tr.ledger_id, tr.profile_id, tr.data_hash, tr.year, tr.month," + + " tr.day, tr.description, tr.comment, tr.generation FROM transactions tr JOIN " + + "transaction_accounts ta ON ta.transaction_id=tr.id WHERE ta.account_name LIKE " + + ":accountName||'%' AND ta.amount <> 0 AND tr.profile_id = :profileId ORDER BY tr.year " + + "desc, tr.month desc, tr.day desc, tr.id desc") + public abstract List getAllWithAccountsFilteredSync(long profileId, + String accountName); + public long getGenerationSync(long profileId) { TransactionGenerationContainer result = getGenerationPOJOSync(profileId); -- 2.39.5