版本更改后,RoomDatabase无法重建

时间:2018-03-11 17:37:11

标签: android android-room android-database

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

只要我向其中一个实体添加另一个字段,这似乎就不再适用了。 onOpen只是没有被调用。 所以我将版本号从1更改为2,以强制数据库重建自己。

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

但这既不起作用。无论是onCreate还是onOpen都被调用了。

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

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

1 个答案:

答案 0 :(得分: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()来使用破坏性迁移。这将简单地破坏预先存在的数据库并重新创建它。 警告:使用此方法将丢失数据库中的所有数据。

相关问题