【问题标题】:Cannot pre-populate room database when changing schema更改架构时无法预填充房间数据库
【发布时间】:2021-03-25 10:52:56
【问题描述】:

当我试图更改数据库中表的架构/数据时,我遇到了一个我无法解决的问题。我正在使用 Rooms .createFromAsset 方法预填充数据库。

当前架构和数据(工作) - 如 DB Browser 中所示 - 这是用于预填充应用程序数据库的数据库。

当我使用此代码构建数据库时:

 val instance = Room.databaseBuilder(
                context.applicationContext,
                MetarDatabase::class.java,
                "metar_database"
            )
                    .createFromAsset("database/metar_database.db")
                    .fallbackToDestructiveMigration()
                    .build()

还有这个数据类:

    @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 文件并导入数据库浏览器中的新表来完成,然后重命名为 airport_table 并添加一个到数据库版本),它不会加载数据。

例如:(不预填充):

 @Entity(tableName = "airport_table")
data class Airport(
    @PrimaryKey(autoGenerate = false)
    val icao : String,
    val name : String?
)

除了我认为不相关的“E/libc:访问被拒绝查找属性“ro.serialno””之外,我没有收到任何错误。

此外 - 更改这张表意味着我的另一张表不会预先填充。 但是空数据库仍然成功创建,我可以在应用程序中添加它。

请帮助我 - 我已经查看了堆栈溢出以寻找类似的问题。有些是相似的,但涉及到让任何事情发生 - 我的问题是它只适用于我在测试时碰巧成功的一个确切模式 - 但我想要另一个模式。

非常感谢, 利亚姆

【问题讨论】:

    标签: android sqlite kotlin android-room android-room-prepackageddatabase


    【解决方案1】:

    如果您打算从 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()
    

    【讨论】:

      【解决方案2】:

      很久之后我才意识到问题所在。

      我认为我不需要迁移,因为我只想更改预填充数据库,而不是迁移设备上当前的任何内容。但是,当您向架构编号添加 1 时,使用破坏性迁移也会删除您的预填充数据。

      所以只需添加一个空迁移,它就可以工作了

      val migration1: Migration = object : Migration(5, 6) { override fun migrate(database: SupportSQLiteDatabase) {}}
      

      非常感谢我自己整理我的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-22
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多