kotlin ANDROID-ROOM-通过迁移预填充数据库

qxsslcnc  于 2023-04-12  发布在  Kotlin
关注(0)|答案(1)|浏览(143)

我知道使用Room,我可以在版本之间创建迁移,就像在这个例子中,我将数据库的版本从1更新到2,并像这样实现我的RoomDatabase:

@Database(entities = [FooEntity::class, BarEntity::class], version = 2)
abstract class MyDatabase : RoomDatabase() {

    abstract fun fooDao(): FooDao
    abstract fun barDao(): BarDao
    
    companion object {
        const val DATABASE_NAME: String = "my_database"

        val MIGRATION_1_2 = object : Migration(1, 2) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("INSERT INTO foo (id, description) VALUES (1, \"Some text\"")
            }
        }
    }
}

然后像这样使用它:

Room.databaseBuilder(androidContext(), MyDatabase::class.java, MyDatabase.DATABASE_NAME)
    .fallbackToDestructiveMigration()
    .addMigrations(MIGRATION_1_2)
    .build()

但是,是否可以创建一个“迁移”,以便在第一次安装应用程序时执行?
我试着创建这样的东西,但它没有工作:

@Database(entities = [FooEntity::class, BarEntity::class], version = 1)
abstract class MyDatabase : RoomDatabase() {
 
    companion object {
        const val DATABASE_NAME: String = "my_database"

        val MIGRATION_0_1 = object : Migration(0, 1) {
            override fun migrate(database: SupportSQLiteDatabase) {
                database.execSQL("INSERT INTO foo (id, description) VALUES (1, \"Some text\"")
            }
        }
    }
}

然后像这样使用它:

Room.databaseBuilder(androidContext(), MyDatabase::class.java, MyDatabase.DATABASE_NAME)
    .fallbackToDestructiveMigration()
    .addMigrations(MIGRATION_0_1)
    .build()

不久前我尝试了从应用程序资产中预填充,但我很确定我在重置数据库时遇到了一些问题,所以我不确定这是否是最好的选择:

Room.databaseBuilder(appContext, MyDatabase::class.java, "Sample.db")
    .createFromAsset("database/myapp.db")
    .build()
vd2z7a6w

vd2z7a6w1#

在Room中创建数据库时执行代码的方法是在数据库上设置一个回调并覆盖它的onCreate

Room.databaseBuilder(androidContext(), MyDatabase::class.java, MyDatabase.DATABASE_NAME)
    .addCallback(object : RoomDatabase.Callback() {
        override fun onCreate(db: SupportSQLiteDatabase) {
            db.execSQL("INSERT INTO foo (id, description) VALUES (1, \"Some text\"")
        }
    })
    .build()

但是,您确实应该考虑从您提到的资产中进行预填充,特别是如果要插入的数据很大的话。

相关问题