了解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 ")
}
}