From de6afbc1fedfde3455e7126dc368265fb4b7eed3 Mon Sep 17 00:00:00 2001 From: Yongxin Wang Date: Fri, 27 Nov 2015 14:00:30 +0800 Subject: [PATCH] fix the bug that modify account name will delete all transaction under the account --- .../gnucash/android/db/DatabaseAdapter.java | 18 ++++++++++++++++++ .../ui/account/AccountFormFragment.java | 2 ++ 2 files changed, 20 insertions(+) diff --git a/app/src/main/java/org/gnucash/android/db/DatabaseAdapter.java b/app/src/main/java/org/gnucash/android/db/DatabaseAdapter.java index 5281404ff..533b7af72 100644 --- a/app/src/main/java/org/gnucash/android/db/DatabaseAdapter.java +++ b/app/src/main/java/org/gnucash/android/db/DatabaseAdapter.java @@ -56,6 +56,10 @@ public abstract class DatabaseAdapter { protected SQLiteStatement mReplaceStatement; + public enum UpdateMethod { + insert, update, replace + }; + /** * Opens the database adapter with an existing database * @param db SQLiteDatabase object @@ -620,6 +624,20 @@ public void setTransactionSuccessful() { mDb.setTransactionSuccessful(); } + /// Foreign key constraits should be enabled in general. + /// But if it affects speed (check constraints takes time) + /// and the constrained can be assured by the program, + /// or if some SQL exec will cause deletion of records + /// (like use replace in accounts update will delete all transactions) + /// that need not be deleted, then it can be disabled temporarily + public void enableForeignKey(boolean enable) { + if (enable){ + mDb.execSQL("PRAGMA foreign_keys=ON"); + } else { + mDb.execSQL("PRAGMA foreign_keys=OFF"); + } + } + /** * Expose mDb.endTransaction() */ diff --git a/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java b/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java index b83b0288f..0a62283f6 100644 --- a/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java +++ b/app/src/main/java/org/gnucash/android/ui/account/AccountFormFragment.java @@ -846,7 +846,9 @@ private void saveAccount() { if (mAccountsDbAdapter == null) mAccountsDbAdapter = AccountsDbAdapter.getInstance(); // bulk update, will not update transactions + mAccountsDbAdapter.enableForeignKey(false); mAccountsDbAdapter.bulkAddRecords(accountsToUpdate); + mAccountsDbAdapter.enableForeignKey(true); finishFragment(); }