【问题标题】:Prepopulating database with room creates database with wrong schema使用房间预填充数据库会创建具有错误架构的数据库
【发布时间】:2021-10-01 19:08:24
【问题描述】:

我需要在我的应用程序中预填充数据库。 Room 正确创建数据库;但是当我尝试与之互动时;该应用程序因Pre-packaged database has an invalid schema 错误而崩溃。生成的文件(来自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`))",
...}

【问题讨论】:

    标签: android database kotlin android-room


    【解决方案1】:

    对于 Room,@Entity 类定义/确定 Room 期望的表。

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

    所以你需要

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

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

    更简单的方法是

    1. 创建实体,
    2. 编译项目(Ctrl + F9)并
    3. 使用 Android Studio 中的 Android 视图,在 Project Explorer 窗口中找到并展开 Java (generated)
    4. 然后展开子目录,找到同名但后缀为_Impl的类,作为你用@Database注解的类。
    5. 在该类中将有一个名为 createAllTables 的方法,可以将表的 EXPECTED SQL 复制并粘贴到 DB Browser 中。李>

    示例

    假设你有 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,那么在编译项目之后:-

    【讨论】:

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