2014-11-02 32 views
4

我想創建一個脫機字典應用程序,有時需要獲取更新,舊數據庫將被替換爲新數據庫。這就是我想要做的,我做了這樣的事情與SQLiteAssetHelper庫:Android SQLiteAssetHelper無法將只讀數據庫從版本1升級到2:

注:SQLiteAssetHelper將資產複製數據庫文件夾到應用程序數據文件夾

public class MyDb extends SQLiteAssetHelper { 
    private static final String DATABASE_NAME = "db.sqlite"; 
    private static final int DATABASE_VERSION = 1; 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

現在我想更新數據庫, puting新db.sqlite文件到文件夾assets後,我有操縱這樣我的代碼:

public class MyDb extends SQLiteAssetHelper { 
    private static final String DATABASE_NAME = "db.sqlite"; 
    private static final int DATABASE_VERSION = 2; 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 
} 

,但是當我編譯和運行它說:無法將只讀數據庫從版本1升級到2

解決方案是什麼?

通過清除應用程序的數據,它會工作得很好......

對不起,我的英語不好......

+0

你能提供'''SQLiteAssetHelper'''的代碼嗎? – 2014-11-02 19:15:31

+0

它在這裏https://github.com/jgilfelt/android-sqlite-asset-helper – Omid 2014-11-02 19:16:02

+0

試試這個鏈接http://stackoverflow.com/questions/14287191/android-cant-upgrade-read-only-database-from-版本0到1 – Jickson 2014-11-02 19:16:18

回答

6

報價the documentation

如果你有一個只讀數據庫或不關心用戶數據丟失,每次通過調用SQLiteAsstHelper子類構造中的setForcedUpgrade()方法來增加版本號(使用資產中的本地數據庫覆蓋本地數據庫)時,您可以強制用戶使用最新版本的SQLite數據庫要麼。

您還可以傳遞參數,該參數是強制升級的版本號。

請注意,這將覆蓋現有的本地數據庫及其中的所有數據。

您沒有從構造函數中調用setForcedUpgrade()

+0

仍然無法使用setForcedUpgrade(); – Omid 2014-11-02 19:44:10

+0

@Omid:重新安裝您的數據庫版本1應用程序並重試,以防過去的嘗試損壞您的文件。除此之外,請考慮在您的問題中發佈整個堆棧跟蹤。 – CommonsWare 2014-11-02 19:46:06

+0

仍然無法正常工作 – Omid 2014-11-02 19:55:24

1

它是由這個解決:

@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion != newVersion) { 
     context.deleteDatabase(DATABASE_NAME); 
     new MyDb(context); 
    }else 
     super.onUpgrade(db, oldVersion, newVersion); 
    } 

這對於一些數據庫得到更新時,我們不需要的舊數據非常有用。

1

請注意刪除舊數據庫並在onUpgrade中創建新數據庫不是正確的解決方案。舊數據必須遷移。如果您對維護較舊的數據ov版本1不感興趣,那就沒問題。

正確的方法是使用onUpgrade修改架構。大部分時間改變模式都需要重新創建表格。在這種情況下,按照以下方法

  1. 重命名現有的表(說table_xyz)進行修改,以一些臨時 名(說temp_table_xyz)
  2. 創建新架構表(table_xyz)
  3. 從複製的內容臨時表temp_table_xyz到 新table_xyz
+0

我的數據並不重要,這是一本字典,有時候我們改變db中的拼寫錯誤。所以舊的db必須刪除我想 – Omid 2014-11-03 15:06:49

6

構造後,你應該叫setForcedUpgrade();

public class MyDb extends SQLiteAssetHelper { 

    private static final int DATABASE_VERSION = 2;//+1 
    public MyDb(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    setForcedUpgrade(); 
    } 
} 
相關問題