【问题标题】:How To recreate Room Database From Assets?如何从资产重新创建房间数据库?
【发布时间】:2021-04-06 05:52:32
【问题描述】:

我在 Asset 文件夹中预加载了数据库,它包含所有数据,当我在 Asset 中编辑我的数据库并增加版本号并使用 fallbackToDestructiveMigration() 应用程序可以工作,但它会丢失我想要的所有数据知道如何使用 fallbackToDestructiveMigration() 从资产中重新创建具有空间的数据库,然后将所有表从资产处理到新数据库 我试过这个solution 但没用,我也累了 迁移但我的数据库有很多表和行,所以我不能这样做

我正在使用 Hilt 并提供这样的空间:

@Singleton
@Provides
fun provideMyDataBase(mApplication: Application): MyDataBase {
    return Room.databaseBuilder(mApplication, MyDataBase::class.java, DATABASE_NAME)
        .createFromAsset(DATABASE_NAME)
        .fallbackToDestructiveMigration()
        .build()
}

【问题讨论】:

  • 确保预填充的数据库与当前数据库具有相同的版本号和相同的表结构。您可以通过 DB Browser 来更新 DB,使用 Android Studio 提供的 Database inspector 来比较两个版本。我遇到了类似的情况,并按照上述步骤解决了。
  • @AlphaOne 我的预加载没有版本表,并且所有表的结构都相同,因为当我清除数据时它工作正常但是当更新我的应用程序时,新版本不能工作数据库为空,所以我试图找到当我增加版本号时,数据库也会将数据从资产复制到并删除以前的表

标签: android kotlin android-room


【解决方案1】:

您可以在创建时使用初始值预填充它

Room.databaseBuilder(context.applicationContext,
    DataDatabase::class.java, "Sample.db")
    // prepopulate the database after onCreate was called
    .addCallback(object : Callback() {
        override fun onCreate(db: SupportSQLiteDatabase) {
            super.onCreate(db)
            // moving to a new thread
            ioThread {
                getInstance(context).dataDao()
                                    .insert(PREPOPULATE_DATA)
            }
        }
    })
    .build()

【讨论】:

  • 我做不到的问题,我说有问题,我有很多表和行,所以我不能手动完成
猜你喜欢
  • 2021-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2012-03-26
相关资源
最近更新 更多