X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Futils%2FMLDB.java;h=03b207c8f02c017e1643e131e1a8ac6b3acde32e;hb=4279b12443f6106017e9f33a5c9e21caf67ec64d;hp=07aea52b34b91a2e425ffda643c77d2a94f57e5f;hpb=64d69a2f7f729949b9236489ab7c4ce9f9aaea86;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java index 07aea52b..03b207c8 100644 --- a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java +++ b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java @@ -73,19 +73,21 @@ public final class MLDB { @Override protected String doInBackground(Void... params) { SQLiteDatabase db = App.getDatabase(); - try (Cursor cursor = db - .rawQuery("select value from options where profile = ? and name=?", - new String[]{NO_PROFILE, name})) + try (Cursor cursor = db.rawQuery( + "select value from options where profile=? and name=?", + new String[]{NO_PROFILE, name})) { if (cursor.moveToFirst()) { String result = cursor.getString(0); - if (result == null) result = defaultValue; + if (result == null) + result = defaultValue; debug("async-db", "option " + name + "=" + result); return result; } - else return defaultValue; + else + return defaultValue; } catch (Exception e) { debug("db", "returning default value for " + name, e); @@ -103,18 +105,20 @@ public final class MLDB { static public String getOption(String name, String default_value) { debug("db", "about to fetch option " + name); SQLiteDatabase db = App.getDatabase(); - try (Cursor cursor = db.rawQuery("select value from options where profile = ? and name=?", + try (Cursor cursor = db.rawQuery("select value from options where profile=? and name=?", new String[]{NO_PROFILE, name})) { if (cursor.moveToFirst()) { String result = cursor.getString(0); - if (result == null) result = default_value; + if (result == null) + result = default_value; debug("db", "option " + name + "=" + result); return result; } - else return default_value; + else + return default_value; } catch (Exception e) { debug("db", "returning default value for " + name, e); @@ -151,16 +155,19 @@ public final class MLDB { adapter.setStringConversionColumn(1); FilterQueryProvider provider = constraint -> { - if (constraint == null) return null; + if (constraint == null) + return null; - String str = constraint.toString().toUpperCase(); + String str = constraint.toString() + .toUpperCase(); debug("autocompletion", "Looking for " + str); String sql; String[] params; if (profileSpecific) { MobileLedgerProfile p = (profile == null) ? Data.profile.getValue() : profile; - if (p == null) throw new AssertionError(); + if (p == null) + throw new AssertionError(); sql = String.format( "SELECT rowid as _id, %s, CASE WHEN %s_upper LIKE ?||'%%' THEN 1 " + "WHEN %s_upper LIKE '%%:'||?||'%%' then 2 " + @@ -189,9 +196,51 @@ public final class MLDB { view.setAdapter(adapter); - if (callback != null) view.setOnItemClickListener((parent, itemView, position, id) -> { - callback.descriptionSelected(String.valueOf(view.getText())); + if (callback != null) + view.setOnItemClickListener( + (parent, itemView, position, id) -> callback.descriptionSelected( + String.valueOf(view.getText()))); + } + public static void queryInBackground(@NonNull String statement, @NonNull String[] params, + @NonNull CallbackHelper callbackHelper) { + /* All callbacks are called in the new (asynchronous) thread! */ + Thread t = new Thread(() -> { + callbackHelper.onStart(); + try { + SQLiteDatabase db = App.getDatabase(); + + try (Cursor cursor = db.rawQuery(statement, params)) { + boolean gotRow = false; + while (cursor.moveToNext()) { + gotRow = true; + if (!callbackHelper.onRow(cursor)) + break; + } + if (!gotRow) { + callbackHelper.onNoRows(); + } + } + } + catch (Exception e) { + callbackHelper.onException(e); + } + finally { + callbackHelper.onDone(); + } }); + + t.start(); + } + /* MLDB.CallbackHelper -- Abstract class for asynchronous SQL query callbacks */ + @SuppressWarnings("WeakerAccess") + abstract public static class CallbackHelper { + public void onStart() {} + public abstract boolean onRow(@NonNull Cursor cursor); + public void onNoRows() {} + public void onException(Exception exception) { + Logger.debug("MLDB", "Exception in asynchronous SQL", exception); + } + public void onDone() {} } }