Made db migration more robust by wrapping in transaction.

This commit is contained in:
Peter Serwylo 2016-07-07 11:04:36 +10:00
parent b4e0bde57f
commit 94c9114862

View File

@ -320,22 +320,28 @@ class DBHelper extends SQLiteOpenHelper {
} }
private void migrateAppPrimaryKeyToRowId(SQLiteDatabase db, int oldVersion) { private void migrateAppPrimaryKeyToRowId(SQLiteDatabase db, int oldVersion) {
if (oldVersion < 58) { if (oldVersion < 58 && !columnExists(db, ApkTable.NAME, ApkTable.Cols.APP_ID)) {
db.execSQL("CREATE INDEX IF NOT EXISTS name ON " + AppTable.NAME + " (" + AppTable.Cols.NAME + ")"); db.beginTransaction();
db.execSQL("CREATE INDEX IF NOT EXISTS added ON " + AppTable.NAME + " (" + AppTable.Cols.ADDED + ")"); try {
db.execSQL("CREATE INDEX IF NOT EXISTS name ON " + AppTable.NAME + " (" + AppTable.Cols.NAME + ")");
db.execSQL("CREATE INDEX IF NOT EXISTS added ON " + AppTable.NAME + " (" + AppTable.Cols.ADDED + ")");
final String alter = "ALTER TABLE " + ApkTable.NAME + " ADD COLUMN " + ApkTable.Cols.APP_ID + " NUMERIC"; final String alter = "ALTER TABLE " + ApkTable.NAME + " ADD COLUMN " + ApkTable.Cols.APP_ID + " NUMERIC";
Log.i(TAG, "Adding appId foreign key to " + ApkTable.NAME); Log.i(TAG, "Adding appId foreign key to " + ApkTable.NAME);
Utils.debugLog(TAG, alter); Utils.debugLog(TAG, alter);
db.execSQL(alter); db.execSQL(alter);
final String update = "UPDATE " + ApkTable.NAME + " SET " + ApkTable.Cols.APP_ID + " = ( " + final String update = "UPDATE " + ApkTable.NAME + " SET " + ApkTable.Cols.APP_ID + " = ( " +
"SELECT app." + AppTable.Cols.ROW_ID + " " + "SELECT app." + AppTable.Cols.ROW_ID + " " +
"FROM " + AppTable.NAME + " AS app " + "FROM " + AppTable.NAME + " AS app " +
"WHERE " + ApkTable.NAME + "." + ApkTable.Cols.PACKAGE_NAME + " = app." + AppTable.Cols.PACKAGE_NAME + ")"; "WHERE " + ApkTable.NAME + "." + ApkTable.Cols.PACKAGE_NAME + " = app." + AppTable.Cols.PACKAGE_NAME + ")";
Log.i(TAG, "Updating foreign key from " + ApkTable.NAME + " to " + AppTable.NAME + " to use numeric foreign key."); Log.i(TAG, "Updating foreign key from " + ApkTable.NAME + " to " + AppTable.NAME + " to use numeric foreign key.");
Utils.debugLog(TAG, update); Utils.debugLog(TAG, update);
db.execSQL(update); db.execSQL(update);
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
} }
} }