[英]Android Room: Migration didn't properly handle, Expected and Found are equal
有人可以帮忙吗? 预期的和发现的几乎是相等的。 为什么房间在这里抱怨?
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 " +
" );"
有人可以帮忙吗?
而不是试图确定您的创建 SQL 的问题(不是它不正确,而是它不符合 Room 的期望) 。 我建议使用由 Room 生成的 SQL ,它是正确的。
添加紧急class 作为AppDatabase class 的@Database
注释中的实体之一后,编译项目(CTRL+F9)。
然后在Android 视图中,找到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 类)以及删除了一些注释。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.