版本更改后 RoomDatabase 未重建
RoomDatabase not rebuilding after version change
我正在使用 Android RoomDatabase。
在应用程序启动时,我通过调用 getOpenHelper().getWritableDatabase();
触发数据库自行初始化。然后我在等待 DatabaseBuilder 的 onOpen 回调。
一旦我将另一个字段添加到我的一个实体中,这似乎就不再起作用了。 onOpen 只是没有被调用。
所以我将版本号从 1 更改为 2,以强制数据库自行重建。
@Database(entities = {Preference.class}, version = 2)
但这都不起作用。 onCreate 和 onOpen 都没有被调用。
唯一对我有用的是为 DatabaseBuilder 提供一个新的数据库名称。但这似乎不对。
所以我的问题是:
为什么在我更改数据库的版本号后没有调用 onCreate 和 onOpen?
为什么要使用 getOpenHelper().getWritableDatabase()
方法?当您实例化数据库时,您应该使用 Room.databaseBuilder()
方法。这将为您实例化数据库,然后您可以在整个应用程序中使用它,而无需处理 writable/readable 数据库,因为 Room 正在为您处理该部分。 (理想情况下,您希望为此遵循单例模式,这样您就只实例化数据库一次。)
您可以在此处找到更多相关文档:
https://developer.android.com/training/data-storage/room/index.html
希望对您有所帮助。
更新
因此,根据您对此的反馈,我对此做了一些进一步的测试。您可以通过 运行ning .isOpen()
在可写数据库上打开或创建数据库。我此时的假设是,除非明确需要,否则实际上不会打开或创建数据库。我假设当您调用 getWritableDatabase()
时,它实际上根本没有打开数据库,只是返回一个可以打开但不被视为已关闭的对象。因此,为什么当您 运行 isOpen()
它 returns 为真并打开数据库。我希望这是对您更有帮助的答案。
迁移注意事项
当您将数据库更新到新版本号时,您需要进行有效的迁移 class 才能将数据库从正确的版本更新到正确的版本。可在此处找到相关文档:
https://developer.android.com/training/data-storage/room/migrating-db-versions.html
或者,对于开发,您可以在 Room Database Builder 上使用函数 .fallbackToDestructiveMigration()
来使用破坏性迁移。这只会破坏您的 pre-existing 数据库并重新创建它。 警告:使用此方法将丢失数据库中的所有数据。
我正在使用 Android RoomDatabase。
在应用程序启动时,我通过调用 getOpenHelper().getWritableDatabase();
触发数据库自行初始化。然后我在等待 DatabaseBuilder 的 onOpen 回调。
一旦我将另一个字段添加到我的一个实体中,这似乎就不再起作用了。 onOpen 只是没有被调用。 所以我将版本号从 1 更改为 2,以强制数据库自行重建。
@Database(entities = {Preference.class}, version = 2)
但这都不起作用。 onCreate 和 onOpen 都没有被调用。
唯一对我有用的是为 DatabaseBuilder 提供一个新的数据库名称。但这似乎不对。
所以我的问题是: 为什么在我更改数据库的版本号后没有调用 onCreate 和 onOpen?
为什么要使用 getOpenHelper().getWritableDatabase()
方法?当您实例化数据库时,您应该使用 Room.databaseBuilder()
方法。这将为您实例化数据库,然后您可以在整个应用程序中使用它,而无需处理 writable/readable 数据库,因为 Room 正在为您处理该部分。 (理想情况下,您希望为此遵循单例模式,这样您就只实例化数据库一次。)
您可以在此处找到更多相关文档:
https://developer.android.com/training/data-storage/room/index.html
希望对您有所帮助。
更新
因此,根据您对此的反馈,我对此做了一些进一步的测试。您可以通过 运行ning .isOpen()
在可写数据库上打开或创建数据库。我此时的假设是,除非明确需要,否则实际上不会打开或创建数据库。我假设当您调用 getWritableDatabase()
时,它实际上根本没有打开数据库,只是返回一个可以打开但不被视为已关闭的对象。因此,为什么当您 运行 isOpen()
它 returns 为真并打开数据库。我希望这是对您更有帮助的答案。
迁移注意事项
当您将数据库更新到新版本号时,您需要进行有效的迁移 class 才能将数据库从正确的版本更新到正确的版本。可在此处找到相关文档:
https://developer.android.com/training/data-storage/room/migrating-db-versions.html
或者,对于开发,您可以在 Room Database Builder 上使用函数 .fallbackToDestructiveMigration()
来使用破坏性迁移。这只会破坏您的 pre-existing 数据库并重新创建它。 警告:使用此方法将丢失数据库中的所有数据。