我想添加三個新表到我現有的sqlite數據庫,我遇到了成功升級後不更新數據庫版本的問題。下面是運行DatabaseHelper:成功升級後Android升級數據庫不更新數據庫版本
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()函數:
3210下面是我的close()函數:
public void close() {
mDb.close();
mDbHelper.close();
}
第一所以會發生什麼運行更高DATABASE_VERSION是第一個onUpgrade日誌讀出: 舊版本1新版本2 db.getVersion是1
第二個日誌是:onUpgrade後 版本是2
但是當數據庫被再次訪問onUpgrade是跑不更新數據庫的版本號,並通過onUpgrade與第一日誌中運行後onUpgrade閱讀: 舊版本1新版本2 db.getVersion是1
然後,應用程序崩潰,因爲它嘗試創建一個已經存在的表。
我試過在onUpgrade中也沒有手動設置數據庫版本。這也沒有用。我也嘗試通過運行更新版本號...
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)";
任何幫助將是巨大的讚賞。
謝謝 凱文
此數據庫中只有一個表,我需要遷移之前我刪除表,你知道一個很好的來源,可以幫助我看到如何做到這一點? 謝謝! – KevinM 2012-07-27 14:18:18
那麼它取決於你正在存儲什麼數據,有多少列,等等。出乎我的意料之外的一種方式是使用一組'ContentValues'。獲取表格中當前所有對象的光標,並將每行放入一個「ContentValues」對象中。 '放下'表格,'創建'新表格,'插入'每個ContentValue,賓果。 – 2012-07-27 15:19:39
這很有道理。我很感激幫助。我會試試看。 – KevinM 2012-07-27 15:25:11