在删除“会议室数据库表”中的所有数据后,如何将ID(我的@PrimaryKey(autogenerate = true)
)设置回0?目前,我的删除有效,但新插入的数据在最后一个ID所在的位置递增。
答案 0 :(得分:3)
@Dao
interface MyDao {
@RawQuery
fun vacuumDb(supportSQLiteQuery: SupportSQLiteQuery): Int
}
删除所有内容后,执行此语句,
MyDao.vacuumDb(SimpleSQLiteQuery("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