我的问题是:在android studio中重新安装应用程序时,如何删除数据库中的所有条目并从0重新启动自动生成的主键?我目前正在尝试使用 Room 数据库来完成个人项目,并且我已经发现用 @Insert 注释的 Dao 方法返回一个 Long 或一个 Long 数组。据我所知,Long 代表插入条目的主键。我还没有设法使 get 方法起作用,所以我无法在 UI 中看到表的元素,但我使用简单的 printlns() 检查插入返回的值,即使在重新安装和重新启动后,它们也会不断增加应用程序。我也已经读过
android:allowBackup="false"
清单文件中的属性。所以我按照 stackoverflow 上的帖子建议将其设置为 false,但显然没有用,因为 insert 返回的值不断增加。因此可能有两种情况:即使我将该属性设置为 false,记录也不会被删除,或者记录被删除但主键未重置,在这种情况下我仍然想知道如何重置它。
我在上面添加了一个链接,其中包括我所做的一些搜索。如果我发现其他内容,我将编辑并添加更多内容。任何建议将不胜感激。
当您使用
autoGenerate=True
时,这实际上并不会打开值的生成。相反,它引入了自动增量约束。
此约束(规则)表示生成的值必须大于已使用的任何值,无论相应的行是否仍然存在。它通过将最近生成的值(最高值)存储在表sqlite_sequence中来实现这一点,该表每个表都有一行,因此它如何保留最高/最大生成的值。
一种选择是重置或删除 sqlite_sequence 表中的相应值。
另一种选择是通过指定
autoGenerate=true
来不指定 autoGenerate=false
,或者默认忽略代码为 false。然而,Room 处理该领域的方式不同。
通常您会:-
@PrimaryKey(autoGenerate='true')
val id: Long=0, ....
Room,当 autoGenerate 为 true 时,采用 0 表示没有特定值,因此底层插入代码不提供值,从而生成值。
同样的代码,但是当autoGenerate为false时,0被认为是要使用的值,并且不会生成该值。
如果代码更改为:-
@PrimaryKey
val id:Long=null, ....
然后,通过不指定值,将 null 传递给插入,然后 sqlite(在作为主键的 INTEGER 类型列的特殊情况下)生成值。
使用 AUTOINCRMENT (autoGenerate=true) 生成值基于 1 + 实际表中的最高值(id 列)和 sqlite_seqeence 中为表存储的值(有史以来分配的最高值)中的较高者。
不带 AUTOINCRMENT 的值的生成只是 1 + 实际表中的最高值(如果表中没有行则为 0)。
但是,此类列的目的是唯一标识一行,将该值用于其他目的,例如期望单调递增的数字(例如 1,2,3,4,5......)可能会导致问题。