我正在使用Android RoomDatabase。
在应用程序启动时,我只需调用getOpenHelper().getWritableDatabase();
即可触发数据库进行初始化。然后我等待DatabaseBuilder的onOpen回调。
只要我向其中一个实体添加另一个字段,这似乎就不再适用了。 onOpen只是没有被调用。 所以我将版本号从1更改为2,以强制数据库重建自己。
@Database(entities = {Preference.class}, version = 2)
但这既不起作用。无论是onCreate还是onOpen都被调用了。
唯一对我有用的是给DatabaseBuilder一个新的数据库名。但这似乎并不合适。
所以我的问题是: 为什么我没有onCreate,因此在我更改数据库的版本号后调用了onOpen?
答案 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()
来使用破坏性迁移。这将简单地破坏预先存在的数据库并重新创建它。 警告:使用此方法将丢失数据库中的所有数据。