在 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
拒绝所有UPDATE
和DELETE
对内部表的查询。
这取决于 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 库中重置自动增量 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章