如何在Room中创建多张表?已定义1个实体无法新增6个实体怎么办
Room新增多实体类修复方案
你需要按以下步骤修改数据库配置:
- 更新
@Database注解参数:将6个新增的实体类全部加入entities数组,同时升高数据库版本号(原版本为1,修改为2即可) - 补充数据库迁移配置:
- 开发调试阶段:可直接在
databaseBuilder后追加fallbackToDestructiveMigration()方法,Room会销毁旧版本数据库并重建,无需编写迁移逻辑,注意该方案会清空所有本地原有数据,仅适合开发阶段使用 - 线上正式环境:需要编写版本1到版本2的Migration逻辑,手动执行新增表的SQL语句,保证用户本地数据不丢失
- 开发调试阶段:可直接在
- 确认
HarryPotterDao中已经添加了对应6个新增实体的增删改查相关方法
修改后的示例代码如下:
// 请将代码中示例的Entity1到Entity6替换为你实际的6个实体类名 @Database(entities = [StaffTable::class, Entity1::class, Entity2::class, Entity3::class, Entity4::class, Entity5::class, Entity6::class] , version = 2, exportSchema = false) abstract class HarryPotterDatabase: RoomDatabase() { abstract fun harryPotterDao(): HarryPotterDao companion object{ @Volatile private var INSTANCE: HarryPotterDatabase? = null fun getDatabase(context: Context): HarryPotterDatabase{ val tempInstance = INSTANCE if (tempInstance != null){ return tempInstance } synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, HarryPotterDatabase::class.java, "user_database" ) // 开发阶段添加此行,线上环境替换为自定义Migration逻辑 .fallbackToDestructiveMigration() .build() INSTANCE = instance return instance } } } }
如果是线上环境使用,需要添加如下迁移逻辑代替fallbackToDestructiveMigration()配置:
val MIGRATION_1_2 = object : Migration(1, 2) { override fun migrate(database: SupportSQLiteDatabase) { // 依次执行6个新增表的创建SQL,SQL语句需要和实体类定义的字段完全对应 database.execSQL("CREATE TABLE IF NOT EXISTS `Entity1` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL)") // 剩余5个表的创建SQL依次补充在此处 } } // 构建数据库时添加迁移配置 val instance = Room.databaseBuilder( context.applicationContext, HarryPotterDatabase::class.java, "user_database" ) .addMigrations(MIGRATION_1_2) .build()
内容的提问来源于stack exchange,提问作者zain mahmood
相关产品推荐
相关产品推荐

