アップグレードが成功した後にDBバージョンを更新しないAndroidアップグレードDB
-
12-12-2019 - |
質問
私の既存のSQLite DBに3つの新しいテーブルを追加しようとしています。以下は実行されるデータベースヘルパーです:
private static class DatabaseHelper extends SQLiteOpenHelper {
public DatabaseHelper(Context context, String name, CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(TAG, "Current db version is " + db.getVersion());
db.execSQL(ORIGINAL_DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
db.setVersion(newVersion);
Log.w(TAG, "Version after onUpgrade is " + db.getVersion());
}
}
.
以下のopen()関数:
public VehicleExpDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx, DATABASE_NAME, null, DATABASE_VERSION);
mDb = mDbHelper.getWritableDatabase();
return this;
}
.
は私のclose()関数です:
public void close() {
mDb.close();
mDbHelper.close();
}
.
だから、データベースが高いほど最初の実行で何が起こるのかは、最初のOnUpgradeログが読み出されます。 古いバージョン1 New Version 2 DB.GetVersionは1
です。2番目のログは次のとおりです。 OnUpgradeの後のバージョンは2
ですしかし、OnUpgradeがranされた後にDBが再びアクセスされたときにDBのバージョン番号が更新されず、onupgradeの読み込みの最初のログでonupgradeを実行します。 古いバージョン1 New Version 2 DB.GetVersionは1
です。それでアプリは既にあるテーブルの作成を試みるのでクラッシュしました。
onupgradeでもDBバージョンを手動で設定しようとしました。これも機能しませんでした。実行してバージョン番号を更新しようとしました...
db.execSQL("PRAGMA user_version = " + newVersion);
.
... onupgradeの終わりに。
編集:
Aswin Kumarの提案私は既存のテーブルをバックアップしてすべてのテーブルをドロップしてから再作成するように私のOnUpgradeを変更しました。これは私のバージョンの問題を修正していません。以下は私のonupgradeとoncreateです:
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(TAG, "Current db version is " + db.getVersion());
db.execSQL(ORIGINAL_DATABASE_CREATE);
db.execSQL(NEW_TABLE_1_DATABASE_CREATE);
db.execSQL(NEW_TABLE_2_DATABASE_CREATE);
db.execSQL(NEW_TABLE_3_DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
mOldDbContents = backupTables(db);
db.execSQL("DROP TABLE IF EXISTS " + ORIGINAL_DATABASE_CREATE);
db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_1_DATABASE_CREATE);
db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_2_DATABASE_CREATE);
db.execSQL("DROP TABLE IF EXISTS " + NEW_TABLE_3_DATABASE_CREATE);
onCreate(db);
}
.
は、テーブルの作成に使用するSQLiteステートメントです。
private static final String ORIGINAL_DATABASE_CREATE = "create table " + VEHICLE_EXPENSE_TABLE_NAME +
" (" + KEY_ROW_ID + " integer primary key autoincrement, " +
KEY_UNIX_DATE + " integer, " +
KEY_DATE + " not null default current_date, " +
KEY_TIME + " not null default current_time, " +
KEY_DESCRIPTION + " text, " +
KEY_START_MILE + " integer, " +
KEY_END_MILE + " integer, " +
KEY_MILES + " text, " +
KEY_AMOUNT + " text, "
+ KEY_PARTY_ID + " integer)";
private static final String NEW_TABLE_1_DATABASE_CREATE = "CREATE TABLE " + PURCHASE_HISTORY_TABLE_NAME +
"(" + HISTORY_ORDER_ID_COL + " TEXT PRIMARY KEY, " +
HISTORY_STATE_COL + " INTEGER, " +
HISTORY_PRODUCT_ID_COL + " TEXT, " +
HISTORY_DEVELOPER_PAYLOAD_COL + " TEXT, " +
HISTORY_PURCHASE_TIME_COL + " INTEGER)";
private static final String NEW_TABLE_2_DATABASE_CREATE = "CREATE TABLE " + PURCHASED_ITEMS_TABLE_NAME +
"(" + PURCHASED_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " +
PURCHASED_QUANTITY_COL + " INTEGER)";
private static final String NEW_TABLE_3_DATABASE_CREATE = "CREATE TABLE " + TRIAL_LIMIT_TABLE_NAME +
"(" + TRIAL_PRODUCT_ID_COL + " TEXT PRIMARY KEY, " +
TRIAL_PRODUCT_NAME + " TEXT, " +
TRIAL_START_DATE + " INTEGER)";
.
あらゆる助けが大いに感謝されるでしょう。
ありがとう、 ケビン
解決 2
自分の問題を修正しました。この問題は、アップグレードしようとしていたのと同じDBにアクセスしていた別のDBヘルパークラスを作成したということでした。この別のDBヘルパークラスでは、バージョン番号が1に設定されました。このアプリは私の最初のJavaとAndroidプログラムであり、DBクラスを恐ろしく設定しました。私はすべてのDBクラスをアップグレードしているものに統合し、今私のDBバージョンはそれがそれほど更新されています。誰かが興味があるなら、以下は私の最後のクラスです。
@Override
public void onCreate(SQLiteDatabase db) {
Log.w(TAG, "Current db version is " + db.getVersion());
db.execSQL(VEHICLE_EXPENSE_DATABASE_CREATE);
db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
db.execSQL(TRIAL_TIME_DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Old Version " + oldVersion + " New Version " + newVersion + " db.getVersion is " + db.getVersion());
if (oldVersion < newVersion) {
if (oldVersion == 1) {
db = upgradeTo2(db);
}
}
}
private SQLiteDatabase upgradeTo2(SQLiteDatabase db) {
db.beginTransaction();
try {
db.execSQL(PURCHASE_HISTORY_DATABASE_CREATE);
db.execSQL(PURCHASE_ITEMS_DATABASE_CREATE);
db.execSQL(TRIAL_TIME_DATABASE_CREATE);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.w(TAG, "onUpgrade failed");
} finally {
db.endTransaction();
}
return db;
}
. 他のヒント
onUpgrade()
では、既存のテーブルをdrop
(データを一時的なデータストラクチャに移行した後)、次に新しいテーブルを作成します(データストラクチャから古いデータを使用して)。そうでない場合は、古いテーブルがまだ存在します。
これが問題を解決しない場合は、db.execSQL()