【Android】Room 添加新表的迁移策略

Android Room 添加新表的迁移策略


摘要

有一个疑问新增room Entity时是否要升级数据库版本并写迁移策略, 答案是肯定的, 当room新增通过更新数据库版本以及创建相应的迁移策略来添加新表。以开源库CacheKRM为例, 展现如何升级的过程

正文
通过更新数据库版本和创建相应的迁移策略来添加新表。

  1. 更新数据库版本
    当您需要在应用中新增表时,首先要做的就是更新数据库版本。将数据库版本号增加,以便 Room 可以识别需要执行迁移操作。例如,原始版本为 1,现在需要添加新表,则应将版本更新为 2。
@Database(entities = [MCacheKRM::class, MCacheKRM2::class], version = 2, exportSchema = false)
abstract class CacheKRMDatabase : RoomDatabase() {
    // ...
}
  1. 编写迁移策略
    编写一个从旧版本到新版本的迁移策略,其中包括 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()
                )
            }
        }
  1. 添加迁移策略
    在构建数据库实例时,使用 .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 数据库时,如何通过更新数据库版本以及创建相应的迁移策略来添加新表。遵循这些步骤,可以确保在数据库结构发生变化时,应用可以顺利地进行迁移,避免数据丢失或损坏的问题。

猜你喜欢

转载自blog.csdn.net/weixin_42473228/article/details/142817803