2012-06-14 50 views
1

在我的應用程序中,我通過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」參數)?那甚至是什麼參數?我怎樣才能在新數據庫中更新數據?

另外:如果有一個更好的方式去了解這一點,我所有的耳朵=)

回答

2

onUpgarde()是爲更新數據庫結構(添加/重命名列等),而不是實際的數據。第一次啓動時,您可能想在實際應用中執行此操作。另外嘗試升級用戶輸入的數據可能不是最好的主意。爲什麼不能有兩個表(甚至是數據庫) - 一個是你提供的數據,另一個是用戶輸入的數據?您可以簡單地複製用戶編輯的行,並將原始數據保持爲只讀。

+0

我以爲這是更新結構,但在我之前的問題上,我聽說它是​​處理數據更新以及模式更新的適當位置......那麼,這會給我帶來一個扳手計劃 – Brett

+0

參考參考文檔:'數據庫需要升級時調用。實現應該使用這個方法來刪除表,添加表或者做其他任何需要升級到新的模式版本的東西。'你當然可以做任何事情,但是由於這是在應用程序第一次使用數據庫時自動調用的,所以你無法控制它。如果您需要進行長時間的數據更新,則最好在應用程序處於穩定狀態時通知用戶(並可能爲他們提供選項)。 –