簡體   English   中英

用房間預填充數據庫會創建具有錯誤模式的數據庫

[英]Prepopulating database with room creates database with wrong schema

我的應用程序中需要一個預填充的數據庫。 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`))",
...}

對於 Room,是 @Entity class 定義/確定 Room 期望的表。

根據消息,您的問題是實體不包含預填充數據庫中的englishTyped列。

所以你需要

  • englishTyped列添加到EnglishMarathi實體(類)
    • 可能是val englishTyped: String
  • 從預填充的數據庫中刪除englishTyped列。

我嘗試從 schema.json sql 腳本從頭開始創建一個小數據庫文件。 問題仍然存在。

更簡單的方法是

  1. 創建實體,
  2. 編譯項目 (Ctrl + F9) 和
  3. 使用 Android 在 Android Studio 中查看,在 Project Explorer Window 中找到並展開Java (generated)
  4. 然后展開子目錄,找到同名的 class,但以_Impl為后綴,與您用 @Database 注釋的 class 相同。
  5. 在該 class 中將有一個名為createAllTables的方法,可以將表的預期SQL 復制並粘貼到 DB Browser 中。

例子

假設您有英語馬拉地語 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 ,然后在編譯項目之后:-

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM