Cor*_*att 6 java sqlite android android-room
我正在尝试使用房间数据库创建一个新表。我遵循了与程序中已有的第一个表相同的原则,但是当运行应用程序时,我收到此错误:
Caused by: java.lang.IllegalStateException: Migration didn't properly handle: WaterFountainEntry(com.mpms.relatorioacessibilidadecortec.entities.WaterFountainEntry).
Expected:
TableInfo{name='WaterFountainEntry', columns={waterFountainHeight=Column{name='waterFountainHeight', type='REAL', affinity='4', notNull=false, primaryKeyPosition=0, defaultValue='null'}, waterFountainID=Column{name='waterFountainID', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=1, defaultValue='null'}, cupHolderHeight=Column{name='cupHolderHeight', type='REAL', affinity='4', notNull=false, primaryKeyPosition=0, defaultValue='null'}, schoolEntryID=Column{name='schoolEntryID', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}, waterFountApproximation=Column{name='waterFountApproximation', type='REAL', affinity='4', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='SchoolEntry', onDelete='CASCADE', onUpdate='CASCADE', columnNames=[schoolEntryID], referenceColumnNames=[cadID]}], indices=[]}
Found:
TableInfo{name='WaterFountainEntry', columns={waterFountainID=Column{name='waterFountainID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=1, defaultValue='null'}, waterFountainHeight=Column{name='waterFountainHeight', type='DOUBLE', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}, cupHolderHeight=Column{name='cupHolderHeight', type='DOUBLE', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}, schoolEntryID=Column{name='schoolEntryID', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, waterFountApproximation=Column{name='waterFountApproximation', type='DOUBLE', affinity='4', notNull=true, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[ForeignKey{referenceTable='SchoolEntry', onDelete='NO ACTION', onUpdate='NO ACTION', columnNames=[schoolEntryID], referenceColumnNames=[cadID]}], indices=[]}
Run Code Online (Sandbox Code Playgroud)
通过阅读此错误消息,我确实收集到该程序期望某些字段具有不同的类型(也可能与它们的顺序不同),但问题是它不应该是这样的。我确保完全按照我在实体中放置字段的方式编写迁移类,如下所示:
<Migration Class and Database Creation>
static final Migration MIGRATION_2_3 = new Migration(2,3) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
database.execSQL("CREATE TABLE WaterFountainEntry (waterFountainID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," +
"schoolEntryID INTEGER NOT NULL, waterFountainHeight DOUBLE NOT NULL, cupHolderHeight DOUBLE NOT NULL," +
"waterFountApproximation DOUBLE NOT NULL, FOREIGN KEY (schoolEntryID) REFERENCES SchoolEntry (cadID))");
}
};
public static ReportDatabase getDatabase(final Context context) {
if (INSTANCE == null){
synchronized (ReportDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), ReportDatabase.class, "ReportDatabase")
.addCallback(roomCallback).addMigrations(MIGRATION_2_3).build();
}
}
}
return INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
<WaterFountainEntry entity>
@Entity(foreignKeys = @ForeignKey(entity = SchoolEntry.class, parentColumns = "cadID", childColumns = "schoolEntryID",
onDelete = CASCADE, onUpdate = CASCADE))
public class WaterFountainEntry {
@PrimaryKey(autoGenerate = true)
@NonNull
private Integer waterFountainID;
@NonNull
private Integer schoolEntryID;
@NonNull
private Double waterFountainHeight;
@NonNull
private Double cupHolderHeight;
@NonNull
private Double waterFountApproximation;
/** getters & setters **/
public WaterFountainEntry(@NonNull Integer schoolEntryID, @NonNull Double waterFountainHeight,
@NonNull Double cupHolderHeight, @NonNull Double waterFountApproximation) {
this.schoolEntryID = schoolEntryID;
this.waterFountainHeight = waterFountainHeight;
this.cupHolderHeight = cupHolderHeight;
this.waterFountApproximation = waterFountApproximation;
}
Run Code Online (Sandbox Code Playgroud)
那么,可能是什么错误呢?我真的看了很多文档也找不到这个问题的原因。
获取正确 SQL 的简单技巧是让 Room 代表您生成 SQL。
创建实体,然后编译(Cntrl+F9),然后查看生成的java(从Android视图),然后查找与@Database类相同且后缀为_Impl的文件,然后找到createAllTables方法并SQL就在那里。这正是 Room 所期望的。
例如:-
| 归档时间: |
|
| 查看次数: |
3167 次 |
| 最近记录: |