【问题标题】:RoomDatabase not rebuilding after version change版本更改后 RoomDatabase 未重建
【发布时间】:2018-03-11 17:37:11
【问题描述】:

我正在使用 Android RoomDatabase。 在应用程序启动时,我只需调用getOpenHelper().getWritableDatabase(); 即可触发数据库进行自身初始化。然后我在等待 DatabaseBuilder 的 onOpen 回调。

一旦我向我的一个实体添加另一个字段,这似乎不再起作用。 onOpen 只是没有被调用。 所以我将版本号从 1 更改为 2,以强制数据库自行重建。

@Database(entities = {Preference.class}, version = 2)

但这两者都不起作用。既没有调用 onCreate 也没有调用 onOpen。​​

唯一对我有用的是给 DatabaseBuilder 一个新的数据库名称。但这似乎不对。

所以我的问题是: 为什么在我更改数据库的版本号后没有调用 onCreate 并因此调用 onOpen?

【问题讨论】:

  • 分享你的日志。

标签: android android-room android-database


【解决方案1】:

您为什么使用getOpenHelper().getWritableDatabase() 方法?当您实例化数据库时,您应该使用Room.databaseBuilder() 方法。这将为您实例化数据库,然后您可以在整个应用程序中使用它,而无需处理可写/可读数据库,因为 Room 正在为您处理该部分。 (理想情况下,您应该为此遵循单例模式,这样您只需要实例化一次数据库。)

您可以在此处找到更多相关文档:

https://developer.android.com/training/data-storage/room/index.html

希望对您有所帮助。

更新

因此,根据您对此提供的反馈,我对此进行了一些进一步的测试。您可以通过在可写数据库上运行.isOpen() 来打开或创建数据库。我在这一点上的假设是,在明确需要之前,不会真正打开或创建数据库。我假设当您调用getWritableDatabase() 时,它实际上并没有打开数据库,只是返回一个可以打开且不被视为关闭的对象。因此,为什么当您运行 isOpen() 时它会返回 true 并打开数据库。我希望这是对您更有帮助的答案。

迁移注意事项

当您将数据库更新到新版本号时,您需要有一个有效的迁移类来将数据库从正确的版本更新到正确的版本。可以在此处找到相关文档:

https://developer.android.com/training/data-storage/room/migrating-db-versions.html

或者,对于开发,您可以使用 Room Database Builder 上的函数 .fallbackToDestructiveMigration() 来使用破坏性迁移。这只会破坏您预先存在的数据库并重新创建它。 警告:使用此方法将丢失数据库中的所有数据。

【讨论】:

  • 我想你误会了。我正在使用房间,因为它打算被使用。我只在我的 MainActivity onCreate 中调用了一次 getWritableDatabase。我这样做是为了让数据库“认为”它是需要的并对其进行初始化,并调用我的构建器的回调“onOpen”。在调用 onOpen 之前,用户会看到一个进度条。因此,当用户与应用程序交互时,我可以确保数据库已经准备好。
  • 只使用回调不是值得吗?就像 RoomDatabase.Callback 类有两个方法 onOpenonCreate。您只需将其创建为匿名类,然后使用 addCallback(RoomDatabase.Callback) 方法将其添加到构建器。这应该完全符合我的想法?
  • 这正是我正在做的。问题是数据库不会在应用程序启动时自动打开,而只会在第一次访问时自动打开。因此,我通过调用 getOpenHelper().getWritableDatabase() 来“伪造”第一次访问,以便为数据库提供一点推动力。
  • 出于好奇,如果您对数据库运行查询而不是使用getOpenHelper().getWritableDatabase() 方法,它会起作用吗?
  • 谢谢!你有点把我推向了正确的方向。通过执行查询,我得到了一个具体的异常,指出我错过了从 1 到 2 的迁移。现在我刚刚添加了 .fallbackToDestructiveMigration(),它工作得很好。您想将其添加到您的答案中吗?除了你的答案是正确的以外,我不会。
猜你喜欢
  • 2021-10-14
  • 2018-07-29
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 2014-06-11
  • 2021-08-31
  • 1970-01-01
  • 2011-08-31
相关资源
最近更新 更多