如何在 Room 数据库中运行迁移以更改主键?

asi*_*ood 6 android android-room

这是我的表:该id列是primary key。我想要Doorway idid一个复合键。是否Room支持呢?如果可以,我该怎么做?

新的主键应该是复合的,应该是这样的:

primary key = id+doorway_id
Run Code Online (Sandbox Code Playgroud)

我的实体:

@Entity(tableName = "hours")
public class Hour extends EntityModel implements Parcelable {
    @SerializedName("id")
    @ColumnInfo(name = COLUMN_ID)
    @PrimaryKey()
    @Expose()
    private int _id;

    // Need to discuss.
    @SerializedName("server_id")
    @ColumnInfo(name = COLUMN_SERVER_ID)
    private int serverId;

    @SerializedName("entries")
    @ColumnInfo(name = COLUMN_ENTRIES)
    @Expose()
    private float entries;

    @SerializedName("alerts")
    @ColumnInfo(name = COLUMN_ALERTS)
    @Expose()
    private float alerts;

    @SerializedName("mag_level")
    @ColumnInfo(name = COLUMN_MAG_LEVEL)
    @Expose()
    private float magLevel;

    @SerializedName("door_open")
    @ColumnInfo(name = COLUMN_DOOR_OPEN)
    @Expose()
    private float doorOpen;

    @SerializedName("entryway_usage")
    @ColumnInfo(name = COLUMN_ENTRYWAY_USAGE)
    @Expose()
    private float entrywayUsage;

    @SerializedName("year")
    @ColumnInfo(name = COLUMN_YEAR)
    @Expose()
    private int year;

    @SerializedName("month")
    @ColumnInfo(name = COLUMN_MONTH)
    @Expose()
    private int month;

    @SerializedName("day")
    @ColumnInfo(name = COLUMN_DAY)
    @Expose()
    private int day;

    @SerializedName("hour")
    @ColumnInfo(name = COLUMN_HOUR)
    @Expose()
    private int hour;

    @SerializedName("alert_rate")
    @Expose
    @ColumnInfo(name = COLUMN_ALERT_RATE)
    private double alert_rate;

    @SerializedName("recorded_at")
    @Expose
    @ColumnInfo(name = COLUMN_TIME_STAMP)
    private String recorded_at;

    @SerializedName("doorway_id")
    @ColumnInfo(name = COLUMN_DOORWAY_ID)
    @Expose()
    private int doorway_id;
}
Run Code Online (Sandbox Code Playgroud)

asi*_*ood 0

没有人回答,因此使用我的评论作为完成这项工作的答案。

找到了解决此问题的方法,只需删除旧表并使用新主键创建新表即可。这是如何

  1. 使用更改后的主键创建新的临时表
  2. 将旧数据复制到新临时表中
  3. 删除旧表
  4. 将新表的名称更改为旧表。