房间数据库 预打包的数据库的架构无效

Posted

技术标签:

【中文标题】房间数据库 预打包的数据库的架构无效【英文标题】:Room database Pre-packaged database has an invalid schema 【发布时间】:2020-02-06 13:18:45 【问题描述】:

我的预打包房间数据库有问题。 我在外部存储上找到了一个数据库。我已复制此数据库以放置在数据库目录中。 复制数据库后,我应该使用Room数据库,但不幸的是, java.lang.IllegalStateException Pre-packaged database has an invalid schema 抛出。

预期:

 TableInfoname='glyphs', columns=max_x=Columnname='max_x', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', glyph_id=Columnname='glyph_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null', page_number=Columnname='page_number', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', max_y=Columnname='max_y', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', line_number=Columnname='line_number', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', sura_number=Columnname='sura_number', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', ayah_number=Columnname='ayah_number', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', min_x=Columnname='min_x', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', position=Columnname='position', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', min_y=Columnname='min_y', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', foreignKeys=[], indices=[]

找到:

TableInfoname='glyphs', columns=max_x=Columnname='max_x', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', glyph_id=Columnname='glyph_id', type='int', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null', page_number=Columnname='page_number', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', max_y=Columnname='max_y', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', line_number=Columnname='line_number', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', sura_number=Columnname='sura_number', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', ayah_number=Columnname='ayah_number', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', min_x=Columnname='min_x', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', position=Columnname='position', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', min_y=Columnname='min_y', type='int', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null', foreignKeys=[], indices=[Indexname='sura_ayah_idx', unique=false, columns=[sura_number, ayah_number], Indexname='page_idx', unique=false, columns=[page_number]]

有什么帮助吗?

【问题讨论】:

【参考方案1】:

您的导出内容似乎没有 Room 支持的列类型。 从您共享的架构的外观来看,Room 期待 INTEGER 而不是“int”。您应该尝试并坚持使用 SQLite 所期望的数据类型,如此处所述: https://www.sqlite.org/datatype3.html

【讨论】:

【参考方案2】:

我发现了问题。 该计划的指标缺失。我已将索引添加到 @Entity 类,它工作正常。

数据库中的

索引用于加速查询,检查official documentation for more details

Room 数据库中的索引示例

@Entity(indices = arrayOf(Index(value = ["last_name", "address"])))
data class User(
    @PrimaryKey val id: Int,
    val firstName: String?,
    val address: String?,
    @ColumnInfo(name = "last_name") val lastName: String?,
    @Ignore val picture: Bitmap?
)

【讨论】:

以上是关于房间数据库 预打包的数据库的架构无效的主要内容,如果未能解决你的问题,请参考以下文章

例外:预打包的数据库具有无效的架构

带有预填充数据库的房间

如何在房间数据库中预填充数据

房间没有更新数据库的架构

Hbuilder打包app

Android Room 将预打包的数据库存储在缓存中是不是正常?