【问题标题】:android, room: is autogenerated primary key always monotonicandroid,房间:自动生成的主键总是单调的
【发布时间】:2020-11-09 15:49:48
【问题描述】:

在我的 Android 应用程序中,我使用 Room 库来实现持久性。

假设,我有一个这样定义的实体:

@Entity(tableName = "my_entity")
public class MyEntity {

    @ColumnInfo(name = "id")
    @PrimaryKey(autoGenerate = true)
    private int id;

    //...
}

我可以相信id 将单调增加的事实吗,即对于新插入的行id 将始终高于所有先前创建的行?

我认为,这不太可能,但我可以想象,Room(或 SQLite - 我不确定,在这种情况下谁负责)可以例如尝试重用之前删除的行的 ID...

据我所知,官方文档并没有透露任何关于它的信息PrimaryKey.AutoGenerate()

【问题讨论】:

  • 很确定它使用 sqlite 自动增量。这确实保证了单调性。见这里:sqlite.org/autoinc.html 我会查看它创建的数据库文件并检查是否设置了属性
  • 如果一个表有 3 个 ID 为 (1,2,3) 的项目。删除最后两个并插入一个后,它变为 (1,4)
  • @Yeldar.N: 简单的例子是这样的事实并不能证明它总是这样。
  • @JensV:感谢您提供指向相关 SQLite 文档的链接。事实上,我查看了生成的模式 json 文件,它有:"createSql": "CREATE TABLE IF NOT EXISTS ${TABLE_NAME}` (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ... )"`,所以根据文档它应该保证(通过 SQLite)是单调的。

标签: android android-room


【解决方案1】:

这个答案是 JensV 的扩展评论。

根据 JensV 的建议,生成的模式 json 文件包含(以及其他):

"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ... <other fields>)"

所以看看我们得到的AUTOINCREMENT 的 SQLite 文档,它保证是单调的。

事实上,这个标志正是为了这个目的:确保生成的值是单调的(没有这个标志,生成的值仍然是唯一的,但不一定是单调的)。考虑到 Room 使用了这个标志,奇怪的是,他们没有在文档中提到它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 2010-12-21
    相关资源
    最近更新 更多