晚上好。我正在嘗試加載準備好的資料庫,但出現錯誤。我得出的結論是,由于 Room 發現了兩列 Scored 和 CityId 之間的差異。Room 期望它們不為零,但在 Student 類中它們已經不為零,就像在準備好的模式中一樣。請幫我弄清楚這個架構需要更改哪些編輯。
java.lang.IllegalStateException: Pre-packaged database has an invalid schema: TABLE_STUDENT(com.aplication.myuniversity.pojo.Student).
Expected:
TableInfo{name='TABLE_STUDENT', columns={CityId=Column{name='CityId', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, Scores=Column{name='Scores', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, Login=Column{name='Login', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Surname=Column{name='Surname', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Uri=Column{name='Uri', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Name=Column{name='Name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Password=Column{name='Password', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[Index{name='index_TABLE_STUDENT__id', unique=true, columns=[_id]}]}
Found:
TableInfo{name='TABLE_STUDENT', columns={CityId=Column{name='CityId', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Scores=Column{name='Scores', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, _id=Column{name='_id', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, Login=Column{name='Login', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Surname=Column{name='Surname', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Uri=Column{name='Uri', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Name=Column{name='Name', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}, Password=Column{name='Password', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[Index{name='index_TABLE_STUDENT__id', unique=true, columns=[_id]}]}
架構
CREATE TABLE "TABLE_STUDENT" (
"_id" INTEGER NOT NULL UNIQUE,
"Name" TEXT,
"Surname" TEXT,
"Login" TEXT,
"Password" TEXT,
"Uri" TEXT,
"CityId" INTEGER,
"Scores" INTEGER,
PRIMARY KEY("_id")
);
爪哇
public class Student {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = BaseColumns._ID)
protected int id;
@ColumnInfo(name = StudentEntry.NAME)
private String name; // name
@ColumnInfo(name = StudentEntry.SURNAME)
private String surname; // surname
@ColumnInfo(name = StudentEntry.LOGIN)
private String login;
@ColumnInfo(name = StudentEntry.PASSWORD)
private String password;
@TypeConverters(URIConverter.class)
@ColumnInfo(name = StudentEntry.URI)
private Uri uri;
@ColumnInfo(name = StudentEntry.CITY_ID)
private int cityId = 0;
@ColumnInfo(name = StudentEntry.SCORES)
private int scores = 0;
}
uj5u.com熱心網友回復:
獲得匹配模式的最簡單方法是
- 創建帶注釋的類
@Entity
并將它們包含在帶@Database
注釋的類中的物體中。 - 編譯 (Ctrl F9) 然后檢查生成的 java(從 Android 視圖可見)。
- 找到與@Database注解類相同但后綴為_Impl的類。
- 在類中找到
createAllTables
方法。 - 然后創建陳述句的 SQL 可用并且可以復制和粘貼。
- 無需在預打包的資料庫中創建 room_master_table。
使用這種方法克服了 Room 的一些細微差別。例如,對于 cityId 和 Scores,如果你有 Integer 而不是 int,我相信,那么 NOT NULL 約束就不需要了。
你的情況發生了什么
指定int cityId = 0;
, 只是說使用默認建構式構建時該值將為 0,它很可能導致分配 0。
更重要的是int(與任何 java 原語一樣)不能為空。因此,RoomNOT NULL
隱式添加了約束。但是,Integer
一個物件可以為空,因此不添加 NOT NULL 約束(它實際上比這更復雜,因此建議讓 Room 代表您完成作業)。
請幫我弄清楚這個架構需要更改哪些編輯。
使用Integer
而不是int
可能會起作用,盡管 getter 和 setter 可能會干擾這一點(注釋處理進行的更復雜的處理)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/468228.html