Room Database Migration无法正确处理新表的创建

时间:2019-09-18 18:05:16

标签: android database sqlite android-room

日志包含:

java.lang.IllegalStateException: Migration didn't properly handle broadBandPlans(duleaf.duapp.splash.data.local.models.FixedPlanLocal).

*Expected:
TableInfo{name='broadBandPlans', columns={speed=Column{name='speed', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0}, prodID=Column{name='prodID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1}}, foreignKeys=[], indices=[]}*

*Found:
TableInfo{name='broadBandPlans', columns={prodID=Column{name='prodID', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=1}, speed=Column{name='speed', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0}}, foreignKeys=[], indices=[]}*

下面是FixedPlanLocal类,有人可以在这里指导我,为什么Room期望速度是第一列,然后是prodID,我应该如何解决呢?

@Entity(tableName = "broadBandPlans")
public class FixedPlanLocal {

    @ColumnInfo(name = "prodID")
    @PrimaryKey
    @NonNull
    String prodID;

    @ColumnInfo(name = "speed")
    String speed;


    public FixedPlanLocal(@NonNull String prodID, String speed) {
        this.prodID = prodID;
        this.speed = speed;
    }

    @NonNull
    public String getProdID() {
        return prodID;
    }

    public void setProdID(@NonNull String prodID) {
        this.prodID = prodID;
    }

    public String getSpeed() {
        return speed;
    }

    public void setSpeed(String speed) {
        this.speed = speed;
    }

    @Override
    public boolean equals(Object obj) {
        return this.prodID.equals(((FixedPlanLocal) obj).prodID);
    }
}
, 

1 个答案:

答案 0 :(得分:1)

您已经使用NOT NULL约束定义了表的 speed 列,因此您需要在实体中的 @NonNull 中的speed列:-< / p>

  • 预期是根据实体
  • 找到的是根据表格

代替:-

public String getSpeed() {
    return speed;
}

使用:-

@NonNull
public String getSpeed() {
    return speed;
}

列的顺序无关紧要,Room似乎始终没有按照预期的顺序对它们进行排序(即,不是按照预期的列表的表或实体进行排序)。

重要的是,期望值和发现值必须保持一致。

在您的情况下,速度列的“实体”(预期)和“表”(找到)为:-

name='speed', type='TEXT', affinity='2', notNull=false, primaryKeyPosition=0
name='speed', type='TEXT', affinity='2', notNull=true, primaryKeyPosition=0

您可以轻松地看到,对于实体,notNull为 false (未编码@NotNull),对于表而言,其 true

解决方法是将@NotNull添加到Entity(如上所述)或更改Table定义,以使speed列不受NOT NULL约束。

  • 请注意,在某些情况下,例如在实体中使用Java主要类型时,意味着@NotNull(在这种情况下,您必须更改表(或使用等效对象代替Java主要类型,例如,使用Integer代替int ))