在 Android 的 Room 库中重置自动增量 [关闭]

Posted

技术标签:

【中文标题】在 Android 的 Room 库中重置自动增量 [关闭]【英文标题】:Reset auto-increment in Android's Room library [closed] 【发布时间】:2019-05-17 06:02:33 【问题描述】:

我使用 android 的 Room 库创建了一个表,其中存储了 User 类型的项目。对于ID列,通过添加注解自动生成值

@PrimaryKey(autoGenerate = true)

在下一次应用程序运行中,我删除了表中的所有条目。但是,自动生成的值不会重置为 0,而是从上次运行的位置继续。

当我删除表中的所有条目时,如何重置自动增量计数器?

【问题讨论】:

Android Room - reset auto generated key on each app run的可能重复 最近回答了这个问题:***.com/a/53764393/549372 这可能对你有帮助:***.com/a/58616764/9726986 如果您主要担心行 id 的整数不足,那么您不必担心。如果最大 ROWID 等于最大可能整数 (9223372036854775807) sqlite.org/autoinc.html,sqlite 将开始使用未使用的整数 @lasec0203 感谢我正在寻找的东西! 【参考方案1】:

你为什么会,也许是更相关的问题。具有 AUTOINCREMENT 的列将是 rowid 列的别名,用于唯一标识行。除了识别行之外,依赖此值并不是最佳做法。

使用 AUTOINCREMENT (autogenerate = true) 会创建一个内部表 sqlite_sequence,该表中的一行保存曾经使用过的最高值 rowid 下一个 rowid 将是该值 + 1。因此是您的问题。

因此,要从 1 重新开始,您必须将 sqlite_sequence 表中的相应行更新为 0,或删除 sqlite_sequence 表中的相应行。 p>

您不妨看看Android Room - reset auto generated key on each app run。 注意这可能是重置序列值的基础,它将始终重置序列值。

【讨论】:

您确定这仍然适用于当前版本的Room?最近我花了整整一个晚上,直到我发现SupportSQLiteDatabase 拒绝所有UPDATEDELETE 对内部表的查询。 这取决于 this 指的是什么。如果这是改变 sqlite_sequence 中相应行的基本原则,那么我不相信房间使用除了 Android 提供的 sqlite 之外的任何东西,并且由于历史版本必须支持这一点而不使用一些特殊编译的 SQLite 版本,强制所有表都没有 rowid 表。 也这么认为...但它使用SupportSQLiteDatabase,它委托给SQLiteDatabase的实现,而不是使用裸SQLiteDatabase...这就是问题所在。只有SQLiteDatabase 将运行操作内部表的查询。上面 cmets 中链接的答案有一个示例项目链接。 没有问题,当使用 AUTOINCREMENT (AUTOGENERATE = True) 时,sqlite_sequence 存储了曾经使用过的最高 rowid。与 SQliteDatabase v SupportSQliteDatabase 无关。 @MartinZeitler If by this (您确定这仍然适用于当前版本的 Room 吗?)您正在谈论链接的答案(我认为这不是确切的同样的问题,但相似)?然后,如果您要查看代码,您会看到它使用 SQLiteDatabase 并且在房间打开数据库之前这样做,因此使用 SQLiteDatabase open 方法打开数据库,因此使用 SQLiteDatabase execSQL 方法。所以我相信它仍然有效。

以上是关于在 Android 的 Room 库中重置自动增量 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Room 持久库中使用复合主键时使主键自动递增?

mySQL 数据库:重置自动增量字段

在脚本mysql中重置自动增量列值

重置 PK 自动增量列

在 Microsoft SQL Server 2008 R2 中重置自动增量

如何在ms访问中重置自动增量字段[重复]