Android Jetpack架構組件-Room升級

了解Room框架的使用

Android Jetpack架構組件-Room基本使用
Android Jetpack架構組件-Room數(shù)據(jù)庫查詢藝術
Android Jetpack架構組件-Room升級

在Android中使用任何一種數(shù)據(jù)庫框架,少不了應用的迭代和數(shù)據(jù)庫的升級,那么Room的該如何正確的升級?

一、Room數(shù)據(jù)庫升級

  • 第一步:增加version數(shù)據(jù),及版本號增加
@Database(entities = [Cheese::class, User::class], version = 2, exportSchema = true)
abstract class CheeseDb : RoomDatabase() {
}
  • 第二步:創(chuàng)建Room特有的Migration
      val MIGRATION_1_2: Migration = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE user ADD COLUMN birthday INTEGER NOT NULL DEFAULT 23 ")
            }
        }

Migration構造函數(shù)中,第一個參數(shù)代碼需要哪個版本才升級,第二個參數(shù),是升級到哪個版本,一般情況和version保持一致

  • 第三步:將Migration添加到配置中,如注釋1所示
instance = Room.databaseBuilder(context, CheeseDb::class.java, "onexzgj")
                    .allowMainThreadQueries()
                    .addMigrations(MIGRATION_1_2)  //注釋1
                    .build()

到這里,一次完整的數(shù)據(jù)庫升級即可完成

二、Room升級常見錯誤

  • 1.數(shù)據(jù)庫的vesion未變 ,添加了Migration的crash
Room cannot verify the data integrity. Looks like you've changed schema but forgot to update the version number. 
You can simply fix this by increasing the version number.
  • 2.數(shù)據(jù)庫的version增加,未提供Migration的crash
Caused by: java.lang.IllegalStateException: A migration from 1 to 1 was required but not found.
Please provide the necessary Migration path via RoomDatabase.Builder.addMigration(Migration ...) or 
allow for destructive migrations via one of the RoomDatabase.Builder.fallbackToDestructiveMigration* methods.
  • 3.第二種情況的錯誤解決
    3.1配置中添加了fallbackToDestructiveMigration()方法,如下所示
    instance = Room.databaseBuilder(context, CheeseDb::class.java, "onexzgj")
                    .allowMainThreadQueries()
                    .fallbackToDestructiveMigration()  //注釋1
                    .build()

即在如上代碼注釋1處添加.fallbackToDestructiveMigration() ,這種方式雖然不會crash,但是數(shù)據(jù)庫的數(shù)據(jù)會清空
3.2配置中添加Migration,數(shù)據(jù)庫升級成功,且不會清空數(shù)據(jù),即按照第一部分正確升級姿勢

  • 4、增加字段未設置默認值
.IllegalStateException: Migration didn't properly handle tasks(googleroom.android.com.google_room.data.Task).
     Expected:

如果在定義Migration的時候,添加的是INTEGER類型的字段,則需要設置默認值,如果不設置默認值,即會遇到如上crash

錯誤Migration示例代碼

     val MIGRATION_1_2: Migration = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE user ADD COLUMN birthday INTEGER")
            }
        }

正確Migration的實例代碼

     val MIGRATION_1_2: Migration = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("ALTER TABLE user ADD COLUMN birthday INTEGER NOT NULL DEFAULT 23 ")
            }
        }
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容