使用房间预填充数据库会创建具有错误架构的数据库

施瑞亚什

我的应用程序中需要一个预填充的数据库。Room正确创建数据库;但是当我尝试与它互动时;该应用程序因Pre-packaged database has an invalid schema错误而崩溃生成的文件 (from data/data/com.myapp/databases/) 文件夹的架构似乎没问题。我正在使用 DB Browser Lite 来直观地创建我的数据库。

MESSAGE -- Pre-packaged database has an invalid schema: EnglishMarathi(com.myapp.data.EnglishMarathi).
     Expected:
    TableInfo{name='EnglishMarathi', columns={id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, word=Column{name='word', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, meaning3=Column{name='meaning3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, meaning2=Column{name='meaning2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, meaning1=Column{name='meaning1', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
     Found:
    TableInfo{name='EnglishMarathi', columns={englishTyped=Column{name='englishTyped', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, word=Column{name='word', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}, meaning3=Column{name='meaning3', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, meaning2=Column{name='meaning2', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, meaning1=Column{name='meaning1', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]} 
CAUSE -- null 
TRACE -- [Ljava.lang.StackTraceElement;@450ced0

更新 1

我尝试从 schema.json sql 脚本从头开始创建一个小型数据库文件。问题仍然存在。

{...
"tableName": "MarathiEnglish",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `word` TEXT NOT NULL, `meaning1` TEXT NOT NULL, `meaning2` TEXT, `meaning3` TEXT, `englishTyped` TEXT, PRIMARY KEY(`id`))",
...}
迈克

在 Room 中,@Entity 类定义/确定 Room 期望的表。

根据消息,您的问题是实体不包括预填充数据库中englishTyped列。

所以你需要要么

  • englishTyped添加EnglishMarathi实体(类)
    • 可能val englishTyped: String
  • 从预先填充的数据库中删除englishTyped列。

我尝试从 schema.json sql 脚本从头开始创建一个小型数据库文件。问题仍然存在。

更简单的方法是

  1. 创建实体,
  2. 编译项目(Ctrl + F9)和
  3. 使用 Android Studio 中的 Android 视图,Java (generated)在项目资源管理器窗口中找到并展开
  4. 然后展开子目录,找到同名但后缀为_Impl的类,作为您使用@Database 注释的类。
  5. 在该类中将有一个名为 的方法createAllTables可以将表EXPECTED SQL 复制并粘贴到数据库浏览器中。

例子

假设您的 EnglishMarathi 课程为:-

@Entity
data class EnglishMarathi(
    @PrimaryKey
    val id: Long,
    @NonNull
    val word: String,
    val meaning1: String,
    val meaning2: String?,
    val meaning3: String?,
    val englishTyped: String
)

并且您的 @Database 注释类是TheDatabase,然后在编译项目后:-

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解决预填充数据库上涉及“ notNull”和“ primaryKeyPosition”的“房间无效”架构错误?

房间给出错误:预打包的数据库的FTS表具有无效的架构

使用 Hilt 预填充房间数据库

更改架构时无法预填充房间数据库

会议室数据库预打包的数据库具有无效的架构

如何创建数据库和表,并用数据填充它们?我有错误

Kotlin andoid 预填充数据库

预填充数据库-Node.js + MongoDB

Android Room预打包的数据库具有无效的架构错误

Room Database无法预填充数据,并且未创建数据库文件

创建数据库脚本,其中表已跨环境预填充数据

问题预填充房间数据库 - 数据库检查器为空

使用 Hilt 预填充 Room 数据库,无需创建额外的数据库实例

通过断言从副本数据库文件使用Room中的预填充数据库

Android Room 给出错误“预打包的数据库具有无效的架构”但导出的架构是正确的

尝试获取项目或插入时使用房间持久性返回空数据库

如何使用房间数据库获取表的最后一条记录

使用Terraform创建数据库架构

使用循环从数据库填充数据表

使用MySQL数据库填充数据表

填充数据库中的表

填充数据库中的选择

从 API 填充数据库

使用Volley预先填充房间数据库

使用数据库中的数据预填充更新表单

预打包的数据库具有无效的架构 Room

如何使用python faker填充数据库

无法使用liquibase填充数据库

使用SQL批量复制填充数据库表