在我的應用程序中,我通過assets文件夾提供最新版本的數據庫。爲了簡單起見,可以說我的數據庫方案是PRIM KEY INTEGER _id,TEXT名稱和INTEGER數量。數量是用戶可以在應用中編輯的唯一東西,其他一切都是靜態數據。在0使用onUpgrade備份舊數據庫,替換數據庫並恢復數據
這裏數量內定就是我目前正在做onUpgrade:
1)遍歷所有的表,發現有一個量> 0的條目,並存儲在這些項保存ID和數量值的對象列表以及原始表名稱。
2)刪除,我只是通過
3.重複舊的數據庫)的新的數據庫從包含更新後的靜態信息資產複製。
4.)遍歷步驟1中的列表,並使用相應表中的數量更新相應的ID。
這是我的onUpdate方法(titleArray是含有我的表名的字符串數組):
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w("TaskDBAdapter", "Upgrading from version " + oldVersion + " to " + newVersion);
ArrayList<backupKey> bak = new ArrayList<backupKey>();
Cursor cursor = null;
for(int i = 0; i < titleArray.length; i++)
{
cursor = db.rawQuery("SELECT * FROM " + titleArray[i] + " WHERE quantity > 0", null);
if (cursor.moveToFirst()){
do{
backupKey key = new backupKey(titleArray[i],
cursor.getInt(cursor.getColumnIndex("_id")),
cursor.getInt(cursor.getColumnIndex("quantity")));
bak.add(key);
}while(cursor.moveToNext());
}
}
cursor.close();
myContext.deleteDatabase(DB_NAME);
try
{
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName, false);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
} catch (IOException e)
{
Log.w("TaskDBAdapter", "failed");
throw new Error("Error copying database");
}
for (int i = 0; i < bak.size(); i++)
{
ContentValues args = new ContentValues();
args.put("quantity", bak.get(i).quantity);
String where = "_id = ?";
String[] whereArgs = {Integer.toString(bak.get(i).id)};
db.update(bak.get(i).range, args, where, whereArgs);
}
} //End of onUpgrade
我可以證實,該ArrayList成功填入正確的數據。我以前只是試圖覆蓋數據庫,但它似乎從來沒有工作。我不得不添加myContext.deleteDatabase(DB_NAME);在文件寫入操作之前數據庫被成功替換。我可以確認我的最終更新迭代不會產生任何奇怪的數據 - 它具有表名,ID和數量的正確值。
問題是,我的onUpgrade後數量沒有更新。靜態數據更新爲我的資產文件夾中包含的最新版本,但數量數據未更新。這是因爲我銷燬了最初提供給方法的數據庫(本例中爲「db」參數)?那甚至是什麼參數?我怎樣才能在新數據庫中更新數據?
另外:如果有一個更好的方式去了解這一點,我所有的耳朵=)
我以爲這是更新結構,但在我之前的問題上,我聽說它是處理數據更新以及模式更新的適當位置......那麼,這會給我帶來一個扳手計劃 – Brett
參考參考文檔:'數據庫需要升級時調用。實現應該使用這個方法來刪除表,添加表或者做其他任何需要升級到新的模式版本的東西。'你當然可以做任何事情,但是由於這是在應用程序第一次使用數據庫時自動調用的,所以你無法控制它。如果您需要進行長時間的數據更新,則最好在應用程序處於穩定狀態時通知用戶(並可能爲他們提供選項)。 –