3

我正在使用新的库版本更新我的应用程序,但我的数据库出现问题。已发布的应用程序当前使用带有 FTS4 的 Room 版本 2.2.6。目前有 LONG for rowid. 该应用程序运行流畅,没有问题。但我想使用 Room 2.3.0 版并根据文档:

FTS 实体表始终有一个名为 rowid 的列,它等效于 INTEGER PRIMARY KEY 索引。因此,一个 FTS 实体只能有一个使用 PrimaryKey 注释的字段,它必须命名为 rowid 并且必须是 INTEGER 亲和性。该字段可以在类中选择性地省略,但仍可在查询中使用。

我应该使用 INT 而不是 LONG。

@Entity(tableName = "visit")
@Fts4
public class Visit {

    @PrimaryKey
    @ColumnInfo(name = "rowid")
    private Long identification; //Change to int

}

有没有办法在不破坏用户数据的情况下更新属性?

4

1 回答 1

2

FTS 实体表始终有一个名为 rowid 的列,它等效于 INTEGER PRIMARY KEY 索引。

简而言之,SQLite 的 INTEGER 并不意味着 Java/Kotlin Integer/Int/int 它是列关联/类型。

如果您查看SQLite 3 中的数据类型,那么 INTEGER 最多可以有 8 个字节(64 位有符号)。在 Java/Kotlin 中是 long/Long。

使用 SQLiteDatabase 便捷方法可以看到进一步的证据,insert因为它返回插入行的 id (rowid) 不是 int 而是 long。

返回long - 新插入行的行 ID,如果发生错误,则返回 -1。

SQLiteAutoincrement解释了rowid,理论上它可以是 1-9223372036854775807(你甚至可以有负值)。

因此,在理论上使用 int/Int/Integer 作为rowid是错误的(实际上不太可能),rowid 可以大于 int/Int/Integer。

我应该使用 INT 而不是 LONG。

我建议你应该使用 Long。它对数据没有影响,因为 SQLite 将在尽可能小的空间中存储一个整数。此外,由于 COLUMN TYPE 将为 INTEGER,因此房间创建的表没有任何区别。

于 2021-06-15T03:44:18.750 回答