繁体   English   中英

使用 FTS4 在房间数据库中将“rowid”从 Long 更改为 Int

[英]Change from Long to Int of `rowid` at Room Database w/ FTS4

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

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

我应该使用 INT 而不是 LONG。

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

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

}

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

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 将在尽可能小的空间中存储 integer。 此外,由于 COLUMN TYPE 将为 INTEGER,因此房间创建的表没有任何区别。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM