更改架构时无法预填充房间数据库
Cannot pre-populate room database when changing schema
当我试图更改数据库中 table 的 schema/data 时,我遇到了无法解决的问题。我正在使用 Rooms .createFromAsset 方法预填充数据库。
当前模式和数据(工作)——如数据库浏览器中所示——这是用于预填充应用程序数据库的数据库。
当我使用以下代码构建数据库时:
val instance = Room.databaseBuilder(
context.applicationContext,
MetarDatabase::class.java,
"metar_database"
)
.createFromAsset("database/metar_database.db")
.fallbackToDestructiveMigration()
.build()
而这个数据class:
@Entity(tableName = "airport_table")
data class Airport(
@PrimaryKey(autoGenerate = false)
val icao : String,
val name : String?,
val municipality : String?,
val scheduled : Boolean,
val iata : String?
)
它成功地将数据库预填充到应用程序中:如数据库资源管理器中所示:
问题是这样的:如果我尝试更改架构:添加列、删除列(通过更改 csv 文件并导入到数据库浏览器中的新 table,然后重新命名来完成到 airport_table 并向数据库版本添加一个),它不会加载数据。
例如:(不预填充):
@Entity(tableName = "airport_table")
data class Airport(
@PrimaryKey(autoGenerate = false)
val icao : String,
val name : String?
)
除了“E/libc: Access denied finding 属性 “ro.serialno””,我没有收到任何错误,我认为这不相关。
此外 - 更改这个 table 意味着我的另一个 table 不会预填充。
不过空数据库还是制作成功了,我可以在app里面添加进去。
请帮助我 - 我已经查看了堆栈溢出以寻找类似的问题。有些是相似的,但涉及让任何事情发生——我的问题是它只适用于我在测试时碰巧成功的一个确切模式——但我想要另一个模式。
非常感谢,
利亚姆
搞了半天才发现问题
我认为我不需要迁移,因为我只想更改预填充的数据库,而不是迁移设备上当前的任何内容。但是,当您向架构编号添加一个时,使用破坏性迁移也会删除您预填充的数据。
所以只需添加一个空的迁移就可以了
val migration1: Migration = object : Migration(5, 6) { override fun migrate(database: SupportSQLiteDatabase) {}}
非常感谢我自己解决了我的问题。
如果您打算从 Room DB 导出文件或使用数据库浏览器访问信息,请先使用 .setJournalMode(JournalMode.TRUNCATE)
。确保所有数据都得到完整保存。我想这是导致此错误的可能原因之一。希望能帮到你
val instance = Room.databaseBuilder(
context.applicationContext,
MetarDatabase::class.java,
"metar_database"
)
.createFromAsset("database/metar_database.db")
.fallbackToDestructiveMigration()
.setJournalMode(JournalMode.TRUNCATE) // Add this line
.build()
当我试图更改数据库中 table 的 schema/data 时,我遇到了无法解决的问题。我正在使用 Rooms .createFromAsset 方法预填充数据库。
当前模式和数据(工作)——如数据库浏览器中所示——这是用于预填充应用程序数据库的数据库。
当我使用以下代码构建数据库时:
val instance = Room.databaseBuilder(
context.applicationContext,
MetarDatabase::class.java,
"metar_database"
)
.createFromAsset("database/metar_database.db")
.fallbackToDestructiveMigration()
.build()
而这个数据class:
@Entity(tableName = "airport_table")
data class Airport(
@PrimaryKey(autoGenerate = false)
val icao : String,
val name : String?,
val municipality : String?,
val scheduled : Boolean,
val iata : String?
)
它成功地将数据库预填充到应用程序中:如数据库资源管理器中所示:
问题是这样的:如果我尝试更改架构:添加列、删除列(通过更改 csv 文件并导入到数据库浏览器中的新 table,然后重新命名来完成到 airport_table 并向数据库版本添加一个),它不会加载数据。
例如:(不预填充):
@Entity(tableName = "airport_table")
data class Airport(
@PrimaryKey(autoGenerate = false)
val icao : String,
val name : String?
)
此外 - 更改这个 table 意味着我的另一个 table 不会预填充。 不过空数据库还是制作成功了,我可以在app里面添加进去。
请帮助我 - 我已经查看了堆栈溢出以寻找类似的问题。有些是相似的,但涉及让任何事情发生——我的问题是它只适用于我在测试时碰巧成功的一个确切模式——但我想要另一个模式。
非常感谢, 利亚姆
搞了半天才发现问题
我认为我不需要迁移,因为我只想更改预填充的数据库,而不是迁移设备上当前的任何内容。但是,当您向架构编号添加一个时,使用破坏性迁移也会删除您预填充的数据。
所以只需添加一个空的迁移就可以了
val migration1: Migration = object : Migration(5, 6) { override fun migrate(database: SupportSQLiteDatabase) {}}
非常感谢我自己解决了我的问题。
如果您打算从 Room DB 导出文件或使用数据库浏览器访问信息,请先使用 .setJournalMode(JournalMode.TRUNCATE)
。确保所有数据都得到完整保存。我想这是导致此错误的可能原因之一。希望能帮到你
val instance = Room.databaseBuilder(
context.applicationContext,
MetarDatabase::class.java,
"metar_database"
)
.createFromAsset("database/metar_database.db")
.fallbackToDestructiveMigration()
.setJournalMode(JournalMode.TRUNCATE) // Add this line
.build()