首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android :迁移没有正确处理,预期和发现是相等的

Android :迁移没有正确处理,预期和发现是相等的
EN

Stack Overflow用户
提问于 2022-09-05 13:48:18
回答 1查看 193关注 0票数 0

期望和发现实际上是相等的。为什么房间在这里抱怨?

代码语言:javascript
运行
复制
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=[]}

这是我的实体:

代码语言:javascript
运行
复制
@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;
}

这是我的迁徙:

代码语言:javascript
运行
复制
 "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 " +
                            " );"
EN

回答 1

Stack Overflow用户

发布于 2022-09-05 21:09:54

而不是试图确定create的问题(不是它不正确,而是它不符合Room的期望)。我建议使用由生成的SQL,它将是正确的。

在将紧急类添加为AppDatabase类的@Database注释中的实体之一后,编译项目 (CTRL+F9)。

  • 很明显你会这么做的。在从一开始就添加迁移时,提到了这一步骤。

然后在java(generated),安卓视图中,找到每个展开并查找AppDatabase_Impl,例如:-

在此范围内,定位createAllTables (通常位于顶部),并为表找到相应的_db.execSQL,例如:-

并将其用于迁移中的SQL,例如:-

代码语言:javascript
运行
复制
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`))");
    }
};

为什么房间在这里抱怨?

这里有一些建议,但正如最初所说的,值得深入研究。

  • 您的代码注释失败(删除了行提要之后),测试结果如下:-
  • 我相信您会发现迁移不会失败,当然也没有必要花时间比较预期的和发现的(我看不到任何显而易见的东西)。
    • 您可能会注意到,在's,中的那个会议室封闭表和列名中有一个不同之处,这可以防止与SQLite关键字的冲突(不是因为我可以看到任何位置和时间戳,最有可能的候选人不是关键词)。
    • 另一个明显的区别是id列是整数(不为NULL) (非常确定作为列或表定义的一部分编码的主键很好)。
    • 如果您希望确定确切的问题,您可以运行测试,从一个逐步更改到另一个。

正如您可能看到的,我已经使用了可用的代码,但是为了满足其他代码(例如LocationRoute类)的需要,我已经使用了一些代码,并删除了一些注释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73610406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档