为 Sqlite 中具有 LONG 数据类型字段的表创建 Room 实体

问题描述 投票:0回答:3

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 数据类型。

android android-sqlite android-room
3个回答
38
投票

简单的答案是你不能

Room 仅支持 5 种数据类型,即

TEXT
INTEGER
BLOB
REAL
UNDEFINED

因此,

Boolean
Integer
Long
的java数据类型都会在
SQL
中转换为INTEGER

您可以做的是将

LONG
数据类型转换为
SQL
中的INTEGER,而不是将
INTEGER
数据类型转换为
Room
中的LONG,以使Room支持
LONG
,而Room不支持不支持。


9
投票

由于文档 SQLITE 不支持 Long,请在此处检查 docs

整数。该值为有符号整数,存储为 1、2、3、4、6 或 8 字节取决于值的大小。

但是由于LONG是8字节,而INTEGER也可以保存8字节的值,所以你可以使用INTEGER


1
投票

如果有人还在为此苦苦挣扎...... 在 SQLite 中创建一个新的数据库文件,复制用于创建表的 SQL 语句,但将每个数据类型更改为 TEXT、INTEGER、BLOB、REAL 和 UNDEFINED。

然后使用从旧数据库复制的 SQL 语句填充表。

这解决了仅更改 SQLite 中的数据类型无法解决的问题。

© www.soinside.com 2019 - 2024. All rights reserved.