Android Room 添加新表的迁移策略
摘要
有一个疑问新增room Entity时是否要升级数据库版本并写迁移策略, 答案是肯定的, 当room新增通过更新数据库版本以及创建相应的迁移策略来添加新表。以开源库CacheKRM为例, 展现如何升级的过程
正文
通过更新数据库版本和创建相应的迁移策略来添加新表。
- 更新数据库版本
当您需要在应用中新增表时,首先要做的就是更新数据库版本。将数据库版本号增加,以便 Room 可以识别需要执行迁移操作。例如,原始版本为 1,现在需要添加新表,则应将版本更新为 2。
@Database(entities = [MCacheKRM::class, MCacheKRM2::class], version = 2, exportSchema = false)
abstract class CacheKRMDatabase : RoomDatabase() {
// ...
}
- 编写迁移策略
编写一个从旧版本到新版本的迁移策略,其中包括 SQL 语句以在数据库中创建新表。例如,创建一个从版本1 到版本 2 的迁移策略:
class MIGRATION_1_2 : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
// 创建新的表 cachekrm2
db.execSQL(
"""
CREATE TABLE IF NOT EXISTS `cachekrm2` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`rmName` TEXT NOT NULL,
`key` TEXT NOT NULL,
`data` BLOB NOT NULL
)
""".trimIndent()
)
}
}
- 添加迁移策略
在构建数据库实例时,使用 .addMigrations() 添加新的迁移策略:
private val _db: CacheKRMDatabase by lazy {
Room.databaseBuilder(UtilKApplicationWrapper.instance.applicationContext, CacheKRMDatabase::class.java, "basick_cachek_rm")
.enableMultiInstanceInvalidation()
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_1_2())
.build()
}
其中: fallbackToDestructiveMigration 可以帮助我们在迁移时发生问题重建表结构而不是闪退
通过这种方式,您可以确保在新增表时数据库能够正确地进行迁移。
完整代码:
@Database(entities = [MCacheKRM::class, MCacheKRM2::class], version = 2, exportSchema = false)
abstract class CacheKRMDatabase : RoomDatabase() {
abstract val cacheKDao: ICacheKRMDao
abstract val cacheKDao2: ICacheKRMDao2
companion object {
private val _db: CacheKRMDatabase by lazy {
Room.databaseBuilder(UtilKApplicationWrapper.instance.applicationContext, CacheKRMDatabase::class.java, "basick_cachek_rm")
.enableMultiInstanceInvalidation()
.allowMainThreadQueries()
.fallbackToDestructiveMigration()
.addMigrations(MIGRATION_1_2())
.build()
}
@JvmStatic
fun get(): CacheKRMDatabase =
_db
fun cacheKDao(): ICacheKRMDao =
get().cacheKDao
fun cacheKDao2(): ICacheKRMDao2 =
get().cacheKDao2
class MIGRATION_1_2 : Migration(1, 2) {
override fun migrate(db: SupportSQLiteDatabase) {
// 创建新的表 cachekrm2
db.execSQL(
"""
CREATE TABLE IF NOT EXISTS `cachekrm2` (
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
`rmName` TEXT NOT NULL,
`key` TEXT NOT NULL,
`data` BLOB NOT NULL
)
""".trimIndent()
)
}
}
}
}
总结
本文详细介绍了在使用 Android Room 数据库时,如何通过更新数据库版本以及创建相应的迁移策略来添加新表。遵循这些步骤,可以确保在数据库结构发生变化时,应用可以顺利地进行迁移,避免数据丢失或损坏的问题。