期望和发现实际上是相等的。为什么房间在这里抱怨?
java.lang.RuntimeException: Exception while computing database live data.
at androidx.room.RoomTrackingLiveData.refreshRunnable$lambda-0(RoomTrackingLiveData.kt:74)
at androidx.room.RoomTrackingLiveData.lambda$UkyPj-RMUoTXOMbUuy5NWSwmo0E(Unknown Source:0)
at androidx.room.-$$Lambda$RoomTrackingLiveData$UkyPj-RMUoTXOMbUuy5NWSwmo0E.run(Unknown Source:2)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:923)
Caused by: java.lang.IllegalStateException: Migration didn't properly handle: emergency(hero.db.model.Emergency).
Expected:
TableInfo{name='emergency', columns={emergency_record_id=Column{name='emergency_record_id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, vehicle_plate=Column{name='vehicle_plate', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, device_id=Column{name='device_id', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, user_id=Column{name='user_id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, sent_to_cloud=Column{name='sent_to_cloud', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, location=Column{name='location', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=1, defaultValue='null'}, emergency_description=Column{name='emergency_description', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, timestamp=Column{name='timestamp', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
Found:
TableInfo{name='emergency', columns={emergency_record_id=Column{name='emergency_record_id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, vehicle_plate=Column{name='vehicle_plate', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, device_id=Column{name='device_id', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, user_id=Column{name='user_id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, sent_to_cloud=Column{name='sent_to_cloud', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, location=Column{name='location', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, id=Column{name='id', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=1, defaultValue='null'}, emergency_description=Column{name='emergency_description', type='TEXT', affinity='2', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}, timestamp=Column{name='timestamp', type='INTEGER', affinity='3', notNull=notNull, primaryKeyPosition=0, defaultValue='null'}}, foreignKeys=[], indices=[]}
这是我的实体:
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity(tableName = AppDatabase.TABLE_EMERGENCY)
public class Emergency {
@ColumnInfo(name = "emergency_record_id")
private Integer emergencyRecordId;
@ColumnInfo(name = "vehicle_plate")
private String vehiclePlate;
@ColumnInfo(name = "device_id")
private String deviceId;
@ColumnInfo(name = "user_id")
private Long userId;
@ColumnInfo(name = "sent_to_cloud")
@JsonIgnore
private Boolean sentToCloud = false;
@ColumnInfo(name = "location")
private LocationRoute location;
@PrimaryKey
@ColumnInfo(name = "id")
private Long id;
@ColumnInfo(name = "emergency_description")
private String emergencyDescription;
@ColumnInfo(name = "timestamp")
private Date timeStamp;
}
这是我的迁徙:
"CREATE TABLE IF NOT EXISTS " + TABLE_EMERGENCY + " (\n " +
"emergency_record_id INTEGER ,\n " +
"vehicle_plate TEXT ,\n " +
"device_id TEXT ,\n " +
"user_id INTEGER ,\n " +
"sent_to_cloud INTEGER ,\n " +
"location TEXT ,\n " +
"id INTEGER PRIMARY KEY NOT NULL,\n " +
"emergency_description TEXT ,\n " +
"timestamp INTEGER \n " +
" );"
发布于 2022-09-05 21:09:54
而不是试图确定create的问题(不是它不正确,而是它不符合Room的期望)。我建议使用由生成的SQL,它将是正确的。
在将紧急类添加为AppDatabase类的@Database
注释中的实体之一后,编译项目 (CTRL+F9)。
然后在java(generated),安卓视图中,找到每个展开并查找AppDatabase_Impl,例如:-
在此范围内,定位createAllTables (通常位于顶部),并为表找到相应的_db.execSQL,例如:-
并将其用于迁移中的SQL,例如:-
static Migration m1to2 = new Migration(1,2) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase database) {
/*
database.execSQL(
"CREATE TABLE IF NOT EXISTS " + TABLE_EMERGENCY + " (" +
"emergency_record_id INTEGER," +
"vehicle_plate TEXT," +
"device_id TEXT," +
"user_id INTEGER, " +
"sent_to_cloud INTEGER, " +
"location TEXT," +
"id INTEGER PRIMARY KEY NOT NULL," +
"emergency_description TEXT," +
"timestamp INTEGER" +
");"
);
*/
database.execSQL("CREATE TABLE IF NOT EXISTS `emergency` (`emergency_record_id` INTEGER, `vehicle_plate` TEXT, `device_id` TEXT, `user_id` INTEGER, `sent_to_cloud` INTEGER, `location` INTEGER, `id` INTEGER, `emergency_description` TEXT, `timestamp` INTEGER, PRIMARY KEY(`id`))");
}
};
为什么房间在这里抱怨?
这里有一些建议,但正如最初所说的,值得深入研究。
正如您可能看到的,我已经使用了可用的代码,但是为了满足其他代码(例如LocationRoute类)的需要,我已经使用了一些代码,并删除了一些注释。
https://stackoverflow.com/questions/73610406
复制相似问题