Skip to content

Commit beaf587

Browse files
committed
delete splits when transaction is saved.
1 parent 7636938 commit beaf587

2 files changed

Lines changed: 41 additions & 9 deletions

File tree

app/src/org/gnucash/android/db/TransactionsDbAdapter.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
import android.content.ContentValues;
2323
import android.content.Context;
2424
import android.database.Cursor;
25+
import android.database.SQLException;
2526
import android.database.sqlite.SQLiteDatabase;
2627
import android.database.sqlite.SQLiteQueryBuilder;
2728
import android.database.sqlite.SQLiteStatement;
29+
import android.text.TextUtils;
2830
import android.util.Log;
2931

3032
import org.gnucash.android.model.*;
@@ -86,16 +88,40 @@ public long addTransaction(Transaction transaction){
8688
contentValues.put(TransactionEntry.COLUMN_RECURRENCE_PERIOD, transaction.getRecurrencePeriod());
8789

8890
Log.d(TAG, "Replacing transaction in db");
89-
long rowId = mDb.replace(TransactionEntry.TABLE_NAME, null, contentValues);
91+
long rowId = -1;
92+
mDb.beginTransaction();
93+
try {
94+
rowId = mDb.replaceOrThrow(TransactionEntry.TABLE_NAME, null, contentValues);
9095

91-
if (rowId > 0){
9296
Log.d(TAG, "Adding splits for transaction");
97+
ArrayList<String> splitUIDs = new ArrayList<String>(transaction.getSplits().size());
9398
for (Split split : transaction.getSplits()) {
94-
mSplitsDbAdapter.addSplit(split);
99+
contentValues.clear();
100+
contentValues.put(SplitEntry.COLUMN_UID, split.getUID());
101+
contentValues.put(SplitEntry.COLUMN_AMOUNT, split.getAmount().absolute().toPlainString());
102+
contentValues.put(SplitEntry.COLUMN_TYPE, split.getType().name());
103+
contentValues.put(SplitEntry.COLUMN_MEMO, split.getMemo());
104+
contentValues.put(SplitEntry.COLUMN_ACCOUNT_UID, split.getAccountUID());
105+
contentValues.put(SplitEntry.COLUMN_TRANSACTION_UID, split.getTransactionUID());
106+
splitUIDs.add(split.getUID());
107+
108+
Log.d(TAG, "Replace transaction split in db");
109+
mDb.replaceOrThrow(SplitEntry.TABLE_NAME, null, contentValues);
95110
}
96111
Log.d(TAG, transaction.getSplits().size() + " splits added");
112+
113+
long deleted = mDb.delete(SplitEntry.TABLE_NAME,
114+
SplitEntry.COLUMN_TRANSACTION_UID + " = ? AND "
115+
+ SplitEntry.COLUMN_UID + " NOT IN ('" + TextUtils.join("' , '", splitUIDs) + "')",
116+
new String[]{transaction.getUID()});
117+
Log.d(TAG, deleted + " splits deleted");
118+
mDb.setTransactionSuccessful();
119+
} catch (SQLException sqle) {
120+
sqle.printStackTrace();
121+
} finally {
122+
mDb.endTransaction();
97123
}
98-
return rowId;
124+
return rowId;
99125
}
100126

101127
/**

app/src/org/gnucash/android/ui/transaction/TransactionFormFragment.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ public class TransactionFormFragment extends SherlockFragment implements
182182
private String mAccountUID;
183183

184184
private List<Split> mSplitsList = new ArrayList<Split>();
185+
/**
186+
* list to hold deleted splits. This split should only be deleted from
187+
* DB when the transaction is saved.
188+
*/
189+
private List<String> mDeletedSplitUIDList = new ArrayList<String>();
185190

186191
/**
187192
* Create the view and retrieve references to the UI elements
@@ -671,6 +676,8 @@ private void saveNewTransaction() {
671676
mTransaction.setTime(cal.getTimeInMillis());
672677
mTransaction.setNote(notes);
673678

679+
// set as not exported.
680+
mTransaction.setExported(false);
674681
//save the normal transaction first
675682
mTransactionsDbAdapter.addTransaction(mTransaction);
676683
scheduleRecurringTransaction();
@@ -761,11 +768,10 @@ public void setSplitList(List<Split> splitList, List<String> removedSplitUIDs){
761768
setAmountEditViewVisible(View.GONE);
762769
}
763770

764-
SplitsDbAdapter splitsDbAdapter = new SplitsDbAdapter(getActivity());
765-
for (String removedSplitUID : removedSplitUIDs) {
766-
splitsDbAdapter.deleteRecord(splitsDbAdapter.getID(removedSplitUID));
767-
}
768-
splitsDbAdapter.close();
771+
// save the deleted UID list. Use add instead of assign in case this
772+
// is called multiple times
773+
// The splits will be actually deleted when the transaction is saved.
774+
mDeletedSplitUIDList.addAll(removedSplitUIDs);
769775
}
770776

771777
/**

0 commit comments

Comments
 (0)