App 数据库有 Items 表,其中有一列 Price,数据类型为 Long。 数据库版本 = 1
CREATE TABLE items (_id INTEGER PRIMARY KEY AUTOINCREMENT,item_id
INTEGER,title TEXT,price LONG, UNIQUE (item_id) ON CONFLICT IGNORE)
在尝试迁移到 Room 时,我遇到以下问题
java.lang.IllegalStateException: Migration didn't properly handle items(moka.pos.test.data.entity.Item).
Expected : price=Column{name='price', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0}
Found : price=Column{name='price', type='LONG', affinity='1', notNull=false, primaryKeyPosition=0}
这是我的 Item 实体类
@Entity(tableName = "items")
public class Item {
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "_id")
private Integer _ID;
@ColumnInfo(name = "item_id")
private Integer id;
@ColumnInfo(name = "title")
private String title;
@ColumnInfo(name = "price")
private Long price;
public Integer get_ID() {
return _ID;
}
public void set_ID(Integer _ID) {
this._ID = _ID;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getPrice() {
return price;
}
public void setPrice(Long price) {
this.price = (long) (getId() * AppUtil.getRandomNumber(10, 99));
}
}
从 SQLiteOpenHelper 迁移到 Room 时如何使 Room 实体字段支持 Long 数据类型。
简单的答案是你不能
Room 仅支持 5 种数据类型,即
TEXT
、INTEGER
、BLOB
、REAL
和 UNDEFINED
。
因此,
Boolean
、Integer
、Long
的java数据类型都会在SQL中转换为
INTEGER
。
您可以做的是将
LONG
数据类型转换为SQL中的
INTEGER
,而不是将INTEGER
数据类型转换为Room中的
LONG
,以使Room支持LONG
,而Room不支持不支持。
由于文档 SQLITE 不支持 Long,请在此处检查 docs。
整数。该值为有符号整数,存储为 1、2、3、4、6 或 8 字节取决于值的大小。
但是由于LONG是8字节,而INTEGER也可以保存8字节的值,所以你可以使用INTEGER。
如果有人还在为此苦苦挣扎...... 在 SQLite 中创建一个新的数据库文件,复制用于创建表的 SQL 语句,但将每个数据类型更改为 TEXT、INTEGER、BLOB、REAL 和 UNDEFINED。
然后使用从旧数据库复制的 SQL 语句填充表。
这解决了仅更改 SQLite 中的数据类型无法解决的问题。