删除数据后房间重置增量键

时间:2019-07-04 12:30:25

标签: android android-room android-architecture-components

在删除“会议室数据库表”中的所有数据后,如何将ID(我的@PrimaryKey(autogenerate = true))设置回0?目前,我的删除有效,但新插入的数据在最后一个ID所在的位置递增。

1 个答案:

答案 0 :(得分:3)

@Dao
interface MyDao {

 @RawQuery
 fun vacuumDb(supportSQLiteQuery: SupportSQLiteQuery): Int
}

删除所有内容后,执行此语句,

MyDao.vacuumDb(SimpleSQLiteQuery("VACUUM"))

VACUUM命令不会更改数据库的内容,但会更改。这将重置

VACUUM如何工作?

  

VACUUM命令的工作方式是将数据库的内容复制到一个临时数据库文件中,然后用该临时文件的内容覆盖原始文件。覆盖原始文件时,将使用回滚日志或预写日志WAL文件,就像处理任何其他数据库事务一样。这意味着在对数据库进行真空处理时,所需的可用磁盘空间是原始数据库文件大小的两倍。

     

VACUUM INTO命令的工作方式相同,不同之处在于它使用INTO子句上命名的文件代替临时数据库,并省略了将清理后的数据库复制回原始数据库之上的步骤。

     

VACUUM命令可以更改任何没有显式INTEGER PRIMARY KEY的表中条目的ROWID。

     

如果数据库连接上有尝试运行VACUUM的打开事务,则VACUUM将失败。未完成的SQL语句通常使读取事务处于打开状态,因此,如果同一连接上存在未完成的SQL语句,则VACUUM可能会失败。 VACUUM(但不是VACUUM INTO)是一种写操作,因此,如果另一个数据库连接持有阻止写操作的锁,则VACUUM将失败。

     

在删除数据后使用VACUUM命令回收空间的另一种方法是使用auto_vacuum编译指示启用自动真空模式。为数据库启用auto_vacuum时,删除数据后可能会回收空闲页面,从而导致文件缩小,而无需使用VACUUM重建整个数据库。但是,使用auto_vacuum可能导致额外的数据库文件碎片。而且auto_vacuum不会像VACUUM那样压缩数据库的部分填充页面。

更多信息:SQLite VACUUM