【问题标题】:Room database always creates my database over and over房间数据库总是一遍又一遍地创建我的数据库
【发布时间】:2021-12-20 22:15:33
【问题描述】:

在我的应用程序室数据库是从 assets 文件夹创建的:

@Provides
@Singleton
fun provideIrregularVerbsDatabase(app: Application): IrregularVerbsDatabase =
        Room.databaseBuilder(app, IrregularVerbsDatabase::class.java, IrregularVerbsConst.DATABASE_NAME)
            .createFromAsset("database/irregular_verbs.db")
            .fallbackToDestructiveMigration()
            .build()

没关系,当我在运行时更改某些行的内容时,将数据添加到它完成工作的表中。但是如果我完全退出应用程序并再次进入,Room 将使用资产中的数据库文件再次创建我的数据库,因此在运行时插入的所有数据都将被删除。

有什么办法可以预防吗?

【问题讨论】:

  • 删除fallbackToDestructiveMigration() 不用于生产;每次启动应用程序时它都会清除数据库
  • @Zain 数据库版本更改一次时是否清空数据库,然后不清空?还是总是不看数据库版本就清空数据库?
  • 我不认为这是问题所在。 fallbackToDestructiveMigration() 确实不适用于生产,但它不会在启动时破坏数据库而无需更改架构。
  • 这是正确的@HenryTwist ..我没有表达好,我的意思是每次在android studio上运行应用程序;它将拥有一个全新的数据库。
  • 没关系,在运行时,如果我更改某些行的内容,将数据添加到它的工作表中。 你确定吗?您如何确认更改/添加已被应用?我怀疑也许他们没有被应用。也许在进行更改/添加时使用应用检查并查看数据库(确保刷新)。

标签: android android-room


【解决方案1】:

您可能会遇到 3 种可能的情况,您正在经历什么。

第一个是如果应用的更改/添加实际上没有被应用。您可以使用 Android Studio 的应用检查来消除此问题,以查看是否正在应用更改/添加。

  • 以下内容来自您的代码模型。当资产数据库有 2 行(跑步和步行)并且在应用程序运行时添加了两行(跳过和攀爬)(即这符合,在这种情况下,正在添加数据):-

另一种可能的情况是,如果说你但如果我完全退出应用程序并再次进入意味着你卸载应用程序然后再次进入。

  • 卸载应用程序会删除数据库,因此会再次从资产中复制。因此,您将丢失所有数据更改。

可能引起混淆的第三种情况是,如果您增加版本号 IrregularVerbsConst.DATABASE_NAME 并且没有迁移代码来涵盖从旧版本到新版本的迁移(您没有添加迁移但您确实有 fallbackToDestructiveMigration)。 fallbackToDestructiveMigration 基本上是说,在没有对版本号所做的更改进行迁移的情况下,删除所有表并重新创建它们。因此,如果您更改了版本号,您将丢失所有数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多