在Android、Room中重新安装应用程序时,如何删除数据库中的所有条目并完全重新初始化包括主键?

问题描述 投票:0回答:1

我的问题是:在android studio中重新安装应用程序时,如何删除数据库中的所有条目并从0重新启动自动生成的主键?我目前正在尝试使用 Room 数据库来完成个人项目,并且我已经发现用 @Insert 注释的 Dao 方法返回一个 Long 或一个 Long 数组。据我所知,Long 代表插入条目的主键。我还没有设法使 get 方法起作用,所以我无法在 UI 中看到表的元素,但我使用简单的 printlns() 检查插入返回的值,即使在重新安装和重新启动后,它们也会不断增加应用程序。我也已经读过

android:allowBackup="false"

清单文件中的属性。所以我按照 stackoverflow 上的帖子建议将其设置为 false,但显然没有用,因为 insert 返回的值不断增加。因此可能有两种情况:即使我将该属性设置为 false,记录也不会被删除,或者记录被删除但主键未重置,在这种情况下我仍然想知道如何重置它。

插入返回的长整型值

我在上面添加了一个链接,其中包括我所做的一些搜索。如果我发现其他内容,我将编辑并添加更多内容。任何建议将不胜感激。

android kotlin android-jetpack-compose android-room primary-key
1个回答
0
投票

当您使用

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......)可能会导致问题。

© www.soinside.com 2019 - 2024. All rights reserved.