From b405b2807a60f5289370a1f7296c6066e397862a Mon Sep 17 00:00:00 2001 From: sspanak Date: Thu, 2 Jan 2025 16:23:42 +0200 Subject: [PATCH] Optimized language deletion not to run all languages in one transaction. This used to take a huge amount of storage and could potentially make deleting a long language list impossible --- .../io/github/sspanak/tt9/db/DataStore.java | 24 +++++++++++++++---- .../tt9/db/wordPairs/WordPairStore.java | 11 +++++++++ .../sspanak/tt9/db/words/WordStore.java | 16 +++---------- 3 files changed, 33 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java b/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java index 5a23392c..899aba30 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/DataStore.java @@ -11,6 +11,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; import io.github.sspanak.tt9.db.entities.AddWordResult; import io.github.sspanak.tt9.db.wordPairs.WordPairStore; @@ -20,6 +21,7 @@ import io.github.sspanak.tt9.languages.Language; import io.github.sspanak.tt9.preferences.settings.SettingsStore; import io.github.sspanak.tt9.util.ConsumerCompat; import io.github.sspanak.tt9.util.Logger; +import io.github.sspanak.tt9.util.Timer; public class DataStore { private final static String LOG_TAG = DataStore.class.getSimpleName(); @@ -79,11 +81,23 @@ public class DataStore { public static void deleteLanguages(Runnable notification, @NonNull ArrayList languages) { - runInTransaction( - () -> { words.remove(languages); pairs.remove(languages); }, - notification, - "Failed deleting languages." - ); + Timer.start(LOG_TAG); + + AtomicInteger progress = new AtomicInteger(languages.size()); + Runnable onDeleted = () -> { + if (progress.decrementAndGet() == 0) { + Logger.d(LOG_TAG, "Deleted " + languages.size() + " languages. Time: " + Timer.stop(LOG_TAG) + " ms"); + notification.run(); + } + }; + + for (Language language : languages) { + runInTransaction( + () -> { words.remove(language); pairs.remove(language); }, + onDeleted, + "Failed deleting languages." + ); + } } diff --git a/app/src/main/java/io/github/sspanak/tt9/db/wordPairs/WordPairStore.java b/app/src/main/java/io/github/sspanak/tt9/db/wordPairs/WordPairStore.java index 5b383e87..15ed4302 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/wordPairs/WordPairStore.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/wordPairs/WordPairStore.java @@ -165,6 +165,17 @@ public class WordPairStore extends BaseSyncStore { } + public void remove(@NonNull Language language) { + if (!checkOrNotify()) { + return; + } + + DeleteOps.deleteWordPairs(sqlite.getDb(), language.getId()); + slowestLoadTime = 0; + slowestSaveTime = 0; + } + + public void remove(@NonNull ArrayList languages) { if (!checkOrNotify()) { return; diff --git a/app/src/main/java/io/github/sspanak/tt9/db/words/WordStore.java b/app/src/main/java/io/github/sspanak/tt9/db/words/WordStore.java index a448803f..504691ca 100644 --- a/app/src/main/java/io/github/sspanak/tt9/db/words/WordStore.java +++ b/app/src/main/java/io/github/sspanak/tt9/db/words/WordStore.java @@ -118,20 +118,10 @@ public class WordStore extends BaseSyncStore { } - public void remove(ArrayList languages) { - if (!checkOrNotify()) { - return; + public void remove(Language language) { + if (checkOrNotify() && readOps.exists(sqlite.getDb(), language.getId())) { + DeleteOps.delete(sqlite.getDb(), language.getId()); } - - Timer.start(LOG_TAG); - - for (Language lang : languages) { - if (readOps.exists(sqlite.getDb(), lang.getId())) { - DeleteOps.delete(sqlite.getDb(), lang.getId()); - } - } - - Logger.d(LOG_TAG, "Deleted " + languages.size() + " languages. Time: " + Timer.stop(LOG_TAG) + " ms"); }