在我的应用中,用户可以创建各种列表。这些列表存储在SQLite表中。此外,数据库中还有其他表,我可能希望在将来的应用更新中进行更改。我不知道在这种情况下我该怎么办才能防止用户数据丢失。
答案 0 :(得分:3)
有功能
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {
if(oldVersion < newVersion) {
switch(oldVersion) {
case 29:
migrateFrom24(sqLiteDatabase);
break;
}
}
在此函数中,您可以将现有数据库迁移到新版本而不会丢失数据
您可以添加新表或更新现有表
这是一个示例代码:
private static void migrateFrom24(SQLiteDatabase db) {
db.execSQL("ALTER TABLE Table1 RENAME TO Table2");
db.execSQL("create table Table3 (_id INTEGER PRIMARY KEY AUTOINCREMENT,created INTEGER ,account_id TEXT DEFAULT \'\',warehouse_id TEXT DEFAULT \'\',skunit_id TEXT DEFAULT \'\',transaction_id TEXT DEFAULT \'\',sku_quantity TEXT DEFAULT \'\',skunits_price TEXT DEFAULT \'\',sku_uploaded TEXT DEFAULT \'0\')");
db.execSQL("DROP TABLE Table4");
db.execSQL(" ALTER TABLE Table5 ADD COLUMN column1 INTEGER ");
}
答案 1 :(得分:2)
当应用程序更新时,您需要增加SQLite数据库版本。一旦你增加你的版本onUpgrade(~)
将会调用。
如果您对数据库架构进行了任何更改,则可以删除表并在onCreate(~)
中再次调用onUpgrade(~)
。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "SQLLiteHelper - onUpgrade");
Log.w(TAG, "Upgrading application's database from version "+ oldVersion + " to " + newVersion + ", which will destroy all old data");
/* Drop older table if existed */
db.execSQL("DROP TABLE IF EXISTS " + "TABLE_NAME");
}
您的要求是维护特定表的数据,因此需要将数据迁移到临时表,一旦您使用新结构创建表,您可以将所有数据保存回临时表,并且您必须删除临时表收回数据后的表格。
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i(TAG, "SQLLiteHelper - onUpgrade");
Log.w(TAG, "Upgrading application's database from version "+ oldVersion + " to " + newVersion + ", which will destroy all old data");
/* Moving Data From Old Database to New Database */
db.execSQL("CREATE TABLE TEMP_TABLE_NAME AS SELECT * FROM " + "TABLE_NAME");
/* Deleting Old Table */
db.execSQL("DROP TABLE IF EXISTS " + "TABLE_NAME");
/* Creating Same Table with new/updated schema structure*/
db.execSQL("CREATE TABLE " + "TABLE_NAME" + "(-----TABLE COLUMN DETAILS-----)");
/* Copy back data from temporary tables */
db.execSQL("INSERT INTO " + "TABLE_NAME" + " SELECT * FROM TEMP_TABLE_NAME");
/* Delete temporary table*/
db.execSQL("DROP TABLE IF EXISTS TEMP_TABLE_NAME");
}
希望这有助于满足您的要求。 快乐的编码!!!
答案 2 :(得分:0)