日志包含:
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);
}
}
,
答案 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约束。
Integer
代替int
))