2014-06-05 98 views
7

我正在使用SQLite數據庫編寫Android應用程序。即使全新安裝並重新運行後,也無法將數據庫從版本2降級到1

我有幾個實驗,改變了DB版本爲1〜2

然後,我的數據庫架構趨於穩定,因爲我沒有發佈應用程序,這是我自己用的

我已經決定再次將版本更改爲1。

我做了新鮮安裝,一切正常。

但隨後的第二次運行拋出這個錯誤:

06-05 10:03:35.683: E/AndroidRuntime(9010): android.database.sqlite.SQLiteException: Can't downgrade database from version 2 to 1 
06-05 10:03:35.683: E/AndroidRuntime(9010):  at android.database.sqlite.SQLiteOpenHelper.onDowngrade(SQLiteOpenHelper.java:361) 

,這是爲什麼,畢竟我沒有新的安裝和DB應該被移除。沒有?

如何將版本更改爲1?

+0

看起來你在開始時使用版本1創建數據庫並在運行期間將其升級到某處。之後,你重新運行你的應用程序,並需要降級。在您創建數據庫的地方發佈代碼。 –

+0

http://stackoverflow.com/questions/15018025/cant-downgrade-database-from-version-2-to-1 – user

回答

11

,拋出此異常以下條件:

  • ,你上運行的代碼,該設備具有的版本2
  • 代碼請求的數據庫版本1的數據庫文件(與一個參數SQLiteOpenHelper構造函數)
  • onDowngrade()在您的代碼中未被覆蓋。

你說代碼在全新安裝後第一次正常工作。確保沒有其他代碼將同一數據庫文件的版本號再次提升到2。

+1

版本降級有什麼可能的原因? –

+0

什麼問題穆罕默德巴巴......!那麼有人想從當前模式中刪除一些有衝突的列,有人想刪除未使用的列,有人想重新定義模式,並添加一些新列和舊列,並決定放棄整個事情然後升級? –

0

您不顯示創建數據庫的位置,這是數據庫版本通常分配的位置(即SQLiteOpenHelper ctor)。

有沒有可能在外部文件系統上有數據庫?除非遵循命名約定,否則在刪除應用程序時不會刪除這些文件。

0

您是如何執行全新安裝的?

  • adb install -r?在這種情況下,您的應用程序的數據(包括數據庫)將不會被觸及。
  • adb uninstalladb install?這將是執行乾淨安裝的正確方法。所有數據將在uninstall期間被刪除,您的數據庫將在install之後的第一次啓動後新創建。

但是你寫道,在全新安裝後的第一次啓動時,它工作。 這隻能意味着你在某個地方仍然執行升級到版本2。

0

更新: 轉到應用信息和>存儲和清除數據也應該工作。

它第一次工作但不是第二次的一個可能的原因可能是數據庫沒有在第一次運行中調用?

同樣來自Marshmallow,Android應用數據爲automatically backed up.,適用於目標爲23+的應用,因此您的應用可能在您不知道的情況下從雲端獲得以前的數據庫。

不幸的是,你還不能單獨刪除應用程序數據。但是,如果您不介意爲所有應用程序查殺備份的數據,則可以卸載該應用程序,然後轉至https://myaccount.google.com/dashboard並展開Android部分並刪除備份的應用程序數據。

之後,您應該能夠重新安裝應用程序並獲得全新的數據庫。

這對我有用,但這樣做需要您自擔風險。

1

如果您希望能夠在您的代碼可以處理的版本高於設備的數據庫上運行應用程序,您可以自行覆蓋onDowngrade()

這是onDowngrage()的默認實現:

public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    throw new SQLiteException("Can't downgrade database from version " + 
      oldVersion + " to " + newVersion); 
} 

如果你需要重寫這個方法,請閱讀this question also

沒有重寫該方法,我們不能在增加和執行後減少SQLite版本。所以,你需要變回2或大於2

public DatabaseHelper(Context context) { 
    super(context, DB_NAME, null, 2); 
} 

如果你想更新表格,可能需要通過你需要更新表32和每一次,你需要增加版本(不減少)

0

這意味着已經有一個以前的文件,並且您正嘗試創建另一個具有相同名稱的文件,您可以更改數據庫的名稱,或者在您正在模擬的設備上卸載應用程序,然後再次模擬它。

相關問題