用房间预填充数据库会创建具有错误模式的数据库
Prepopulating database with room creates database with wrong schema
我需要在我的应用程序中预填充数据库。 房间 正确创建数据库;但是当我尝试与之互动时;应用程序崩溃并出现 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`))",
...}
对于 Room,它是 defines/determines Room 期望的 table 的 @Entity class。
根据消息,您的问题是实体不包括
englishTyped 预填充数据库中的列。
所以你需要
- 将 englishTyped 列添加到 EnglishMarathi 实体 (class)
- 可能
val englishTyped: String
或
- 从预填充的数据库中删除 englishTyped 列。
I have tried creating a small database file from scratch from the schema.json sql script. Still the issue is there.
更简单的方法是
- 创建实体,
- 编译项目 (Ctrl + F9) 和
- 使用 Android Studio 中的 Android 视图,在 Project Explorer Window.
中找到并展开 Java (generated)
- 然后展开子目录,找到同名但后缀为_Impl的class,作为你注解的class与@Database.
- 在那个 class 中会有一个名为
createAllTables
的方法,EXPECTED SQL 对于 table(s) 可以复制并粘贴到数据库浏览器中。
例子
假设您有英语马拉地语 class 作为 :-
@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注解class是TheDatabase,然后编译项目后:-
我需要在我的应用程序中预填充数据库。 房间 正确创建数据库;但是当我尝试与之互动时;应用程序崩溃并出现 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`))",
...}
对于 Room,它是 defines/determines Room 期望的 table 的 @Entity class。
根据消息,您的问题是实体不包括 englishTyped 预填充数据库中的列。
所以你需要
- 将 englishTyped 列添加到 EnglishMarathi 实体 (class)
- 可能
val englishTyped: String
或
- 可能
- 从预填充的数据库中删除 englishTyped 列。
I have tried creating a small database file from scratch from the schema.json sql script. Still the issue is there.
更简单的方法是
- 创建实体,
- 编译项目 (Ctrl + F9) 和
- 使用 Android Studio 中的 Android 视图,在 Project Explorer Window. 中找到并展开
- 然后展开子目录,找到同名但后缀为_Impl的class,作为你注解的class与@Database.
- 在那个 class 中会有一个名为
createAllTables
的方法,EXPECTED SQL 对于 table(s) 可以复制并粘贴到数据库浏览器中。
Java (generated)
例子
假设您有英语马拉地语 class 作为 :-
@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注解class是TheDatabase,然后编译项目后:-