繁体   English   中英

Android Room:迁移未正确处理,Expected 和 Found 相等

[英]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`))");
    }
};

为什么房间在这里抱怨?

这里有一些提示,但正如最初所说,是否值得深入研究。

  • 您的失败代码已被注释掉(在删除换行符之后),因为已经过测试:-
  • 我相信你会发现迁移并没有失败,当然也没有必要花时间比较预期发现(我看不到任何明显的东西)。
    • 您可能会注意到 Room 将表名和列名包含在``中的区别,这可以防止与 SQLite 关键字发生冲突(不是说我可以看到任何位置和时间戳,最有可能的候选者不是关键字
    • 另一个明显的区别是id列是 INTEGER (没有 NOT NULL)(很确定 PRIMARY KEY 编码为列或表定义的一部分是好的)。
    • 如果您希望确定确切的问题,您可以运行从一个逐渐更改为另一个的测试。

正如您可能看到的,我已经使用了您可用的代码,但进行了一些更改以适应其他代码(例如 LocationRoute 类)以及删除了一些注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM