使用预填充数据库的房间迁移 - fallbackToDestructiveMigration() 是我唯一的选择吗?
Room Migration with prepopulated DB - Is fallbackToDestructiveMigration() my only option?
我的数据库中有几个表,其中一些包含用户无法更改的预填充内容,而另一些则仅由用户填写。 现在我想更新预填充的静态内容,但保留用户生成的内容。
这个 Android developer guide 就我的问题说了以下内容:
Because there is an implemented migration path from version 2 to version 3, Room runs the defined migrate() method to update the database instance on the device to version 3, preserving the data that is already in the database. Room does not use the prepackaged database file, because Room uses prepackaged database files only in the case of a fallback migration.
所以这意味着我不可能,例如:从 3 列 X、Y 和 Z - 删除列 X 和 Z 并使用更新的数据库文件中的新内容重新创建它们,同时保持列 Y 不变?
下面是问题的说明。
我现在只有2个选项对吗:
- 完全删除表格并使用户丢失其生成的内容,以便他们可以拥有更新的预填充内容
- 为新结构编写迁移,但最终 X.2 和 Z.2 列为空,因为 Room 会忽略我预先填充的 DB 2.0
看看这个库,也许它能帮助你解决这个问题
https://github.com/ueen/RoomAssetHelper
您可以命名应保留的表和列,然后重命名现有数据库,复制新数据库并传输指定的列。
来自 GitHub 页面的示例:
val db = RoomAssetHelper.databaseBuilder(applicationContext,
AppDatabase::class.java,
"chinook.db",
1,
preserve = arrayOf(TablePreserve(table = "yourTable",
preserveColumns = arrayOf("yourColumn"),
matchByColumns = arrayOf("id"))))
.build()
我的数据库中有几个表,其中一些包含用户无法更改的预填充内容,而另一些则仅由用户填写。 现在我想更新预填充的静态内容,但保留用户生成的内容。
这个 Android developer guide 就我的问题说了以下内容:
Because there is an implemented migration path from version 2 to version 3, Room runs the defined migrate() method to update the database instance on the device to version 3, preserving the data that is already in the database. Room does not use the prepackaged database file, because Room uses prepackaged database files only in the case of a fallback migration.
所以这意味着我不可能,例如:从 3 列 X、Y 和 Z - 删除列 X 和 Z 并使用更新的数据库文件中的新内容重新创建它们,同时保持列 Y 不变?
下面是问题的说明。
我现在只有2个选项对吗:
- 完全删除表格并使用户丢失其生成的内容,以便他们可以拥有更新的预填充内容
- 为新结构编写迁移,但最终 X.2 和 Z.2 列为空,因为 Room 会忽略我预先填充的 DB 2.0
看看这个库,也许它能帮助你解决这个问题
https://github.com/ueen/RoomAssetHelper
您可以命名应保留的表和列,然后重命名现有数据库,复制新数据库并传输指定的列。
来自 GitHub 页面的示例:
val db = RoomAssetHelper.databaseBuilder(applicationContext,
AppDatabase::class.java,
"chinook.db",
1,
preserve = arrayOf(TablePreserve(table = "yourTable",
preserveColumns = arrayOf("yourColumn"),
matchByColumns = arrayOf("id"))))
.build()