2012-06-07 54 views
1

我正在開發針對android的測驗類型應用程序,並且旨在能夠隨着時間的推移擴展問題庫。要做到這一點,我是預包裝的SQLite數據庫,並檢查更新,並覆蓋它的升級:Android預打包數據庫更新

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if(newVersion>oldVersion) { 
     InputStream inputStream = null; 
     OutputStream outStream = null; 
     String dbFilePath = DATABASE_PATH + DATABASE_NAME; 
     try { 
      inputStream = myContext.getAssets().open("questions.db"); 
      outStream = new FileOutputStream(dbFilePath); 
      byte[] buffer = new byte[1024]; 
      int length; 
      while ((length = inputStream.read(buffer))>0) { 
       outStream.write(buffer, 0, length); 
      } 

      outStream.flush(); 
      outStream.close(); 
      inputStream.close(); 

     } catch(IOException e) { 
      throw new Error("problem copying database from resource file"); 
     } 
    } 
} 

什麼我不能確定的是如何保存的問題是否已經嘗試(和預防即在升級時被覆蓋)。看來我的選擇是:

1)保存布爾共享偏好的每一個問題ID(可能sharedprefs的LOT)

2)創建一個單獨的數據庫來保存對哪些問題已經回答了數據(似乎像矯枉過正)

3)保持結果的數據在同一個數據庫的一個單獨的表,然後確保只有問表大幹快上升級

4重寫)保持用戶數據中的自己的列問題表,但防止該列被覆蓋。

以上,4看起來是最優雅的(雖然不知道如果可能)。什麼是最好的方式去做(如果它是選項3或4,我該如何去修改代碼?!)

非常感謝!

+0

你能突出你的問題嗎? pleeeeeeeeeez –

+0

上面的代碼會在每次升級應用程序時覆蓋整個數據庫。問題是,這也將覆蓋從應用程序中保存在該數據庫中的任何內容。我的問題是如何替換某些表或列,而不是擦拭整個事情。 – cg5572

+0

你在找這個嗎? http://stackoverflow.com/questions/9109438/using-already-created-database-with-android/9109728#9109728 –

回答

0

如果要保留舊數據庫中的數據,請使用SQL爲這兩個數據庫解析/讀取記錄。只需在舊數據庫中插入新問題,從而通過「INSERT OR UPDATE」語句獲得新數據庫的所有數據。

0

沒辦法!因爲SQLite數據庫的結構,你不能其文件自己

但也許你有改變的選擇:

  1. 閱讀所有的數據庫,改變你的願望表,然後寫。
  2. 將您的更多可重寫表分開存儲。 (這個解決方案是假的,我知道)