From dbfc9014feab2acad5db788f09f35723d4e4d0a1 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 17 Apr 2017 16:58:36 -0700 Subject: Simplifying some DB managed logic > Adding SQLiteTransaction to make it easier to manage DB transactions > Using try-with resource for better resource handling > Defining utility method for iterating over cursor Change-Id: I20b1a62d61798342825ecfeb971e1a0c63c9b6d7 --- .../launcher3/provider/LauncherDbUtils.java | 61 ++++++++++++++-------- .../android/launcher3/provider/RestoreDbTask.java | 8 ++- 2 files changed, 42 insertions(+), 27 deletions(-) (limited to 'src/com/android/launcher3/provider') diff --git a/src/com/android/launcher3/provider/LauncherDbUtils.java b/src/com/android/launcher3/provider/LauncherDbUtils.java index 175835011..632504060 100644 --- a/src/com/android/launcher3/provider/LauncherDbUtils.java +++ b/src/com/android/launcher3/provider/LauncherDbUtils.java @@ -19,15 +19,16 @@ package com.android.launcher3.provider; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; +import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.android.launcher3.LauncherAppState; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.LauncherSettings.WorkspaceScreens; -import com.android.launcher3.logging.FileLog; import java.util.ArrayList; +import java.util.Collection; /** * A set of utility methods for Launcher DB used for DB updates and migration. @@ -44,8 +45,7 @@ public class LauncherDbUtils { * items are simply deleted. */ public static boolean prepareScreenZeroToHostQsb(Context context, SQLiteDatabase db) { - db.beginTransaction(); - try { + try (SQLiteTransaction t = new SQLiteTransaction(db)) { // Get the existing screens ArrayList screenIds = getScreenIdsFromCursor(db.query(WorkspaceScreens.TABLE_NAME, null, null, null, null, null, WorkspaceScreens.SCREEN_RANK)); @@ -68,23 +68,19 @@ public class LauncherDbUtils { } // Check if the first row is empty - try (Cursor c = db.query(Favorites.TABLE_NAME, null, - "container = -100 and screen = 0 and cellY = 0", null, null, null, null)) { - if (c.getCount() == 0) { - // First row is empty, no need to migrate. - return true; - } + if (DatabaseUtils.queryNumEntries(db, Favorites.TABLE_NAME, + "container = -100 and screen = 0 and cellY = 0") == 0) { + // First row is empty, no need to migrate. + return true; } new LossyScreenMigrationTask(context, LauncherAppState.getIDP(context), db) .migrateScreen0(); - db.setTransactionSuccessful(); + t.commit(); return true; } catch (Exception e) { Log.e(TAG, "Failed to update workspace size", e); return false; - } finally { - db.endTransaction(); } } @@ -104,19 +100,40 @@ public class LauncherDbUtils { * Parses the cursor containing workspace screens table and returns the list of screen IDs */ public static ArrayList getScreenIdsFromCursor(Cursor sc) { - ArrayList screenIds = new ArrayList(); try { - final int idIndex = sc.getColumnIndexOrThrow(WorkspaceScreens._ID); - while (sc.moveToNext()) { - try { - screenIds.add(sc.getLong(idIndex)); - } catch (Exception e) { - FileLog.d(TAG, "Invalid screen id", e); - } - } + return iterateCursor(sc, + sc.getColumnIndexOrThrow(WorkspaceScreens._ID), + new ArrayList()); } finally { sc.close(); } - return screenIds; + } + + public static > T iterateCursor(Cursor c, int columnIndex, T out) { + while (c.moveToNext()) { + out.add(c.getLong(columnIndex)); + } + return out; + } + + /** + * Utility class to simplify managing sqlite transactions + */ + public static class SQLiteTransaction implements AutoCloseable { + private final SQLiteDatabase mDb; + + public SQLiteTransaction(SQLiteDatabase db) { + mDb = db; + db.beginTransaction(); + } + + public void commit() { + mDb.setTransactionSuccessful(); + } + + @Override + public void close() { + mDb.endTransaction(); + } } } diff --git a/src/com/android/launcher3/provider/RestoreDbTask.java b/src/com/android/launcher3/provider/RestoreDbTask.java index dc85abad7..00e2644a5 100644 --- a/src/com/android/launcher3/provider/RestoreDbTask.java +++ b/src/com/android/launcher3/provider/RestoreDbTask.java @@ -27,6 +27,7 @@ import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.ShortcutInfo; import com.android.launcher3.Utilities; import com.android.launcher3.logging.FileLog; +import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction; import com.android.launcher3.util.LogConfig; import java.io.InvalidObjectException; @@ -47,16 +48,13 @@ public class RestoreDbTask { public static boolean performRestore(DatabaseHelper helper) { SQLiteDatabase db = helper.getWritableDatabase(); - db.beginTransaction(); - try { + try (SQLiteTransaction t = new SQLiteTransaction(db)) { new RestoreDbTask().sanitizeDB(helper, db); - db.setTransactionSuccessful(); + t.commit(); return true; } catch (Exception e) { FileLog.e(TAG, "Failed to verify db", e); return false; - } finally { - db.endTransaction(); } } -- cgit v1.2.3