greenDao資料庫升級問題
阿新 • • 發佈:2019-01-24
在開發過程中,使用greenDao這個資料庫框架,開始用的時候很方便,也投入使用中,但是後期升級資料庫得時候,遇到了問題,看到網上說的也很好,如果使用預設的那個升級方法,則升級後會把原有資料庫資料全部刪除,但開發中這是沒問題的,如果投入使用中,這將是大麻煩,使用者升級之後相當解除安裝重灌了,這是不允許的,所以需要重寫升級的方法
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { super.onUpgrade(db, oldVersion, newVersion); }
看到網上給到的大多數是外國大神寫的一個升級工具類
MigrationHelper.migrate()
但是這個方法存在一個問題,就是你資料庫新增的新欄位不能是資料型別的,這樣會報錯一個 not null,是什麼原因呢,看他的工具類原理
1、新建一張表temp,和原來old表一模一樣,相當於把資料備份一下
2、刪除old表
3、新建最新的new表,將臨時表temp資料複製進去
4、刪除臨時表temp
那麼問題就在於,如果temp表有1個欄位。新表有2個欄位,而且新多的欄位為int型別,那麼複製資料的時候,new表字段是存NULL,但是其屬性是不能為NULL,這就異常了
所以解決方案有兩種(前提是需要資料型別欄位),一種是把欄位設定為String型別,然後再轉換為需要的資料型別,另一種就是修改升級工具類,在臨時表上也給多加一個一樣的欄位,然後給預設值,因為有了預設值,所有當複製資料的時候就不會是NULL。