Android Room删除数据后主键未重置,如何解决?
Android Room自增主键删除数据后不重置的解决办法
这是SQLite的默认行为:当你用DELETE FROM CoinInfo删除表中所有数据时,SQLite底层维护的自增序列并不会被重置,所以下次插入数据时,主键会从之前的最大值继续递增,和Room框架无关。
解决方法一:删除数据后手动重置自增序列
在你的CoinInfoDao中新增一个方法,直接操作SQLite的系统表SQLITE_SEQUENCE来重置目标表的序列值:
@Dao interface CoinInfoDao { @Insert suspend fun insertAll(vararg coinInfo: CoinInfo): List<Long> @Query("DELETE FROM CoinInfo") suspend fun deleteAll() // 重置自增序列,表名要和@Entity的表名一致 @Query("UPDATE SQLITE_SEQUENCE SET seq = 0 WHERE name = 'CoinInfo'") suspend fun resetAutoIncrement() }
然后在调用deleteAll后,添加对resetAutoIncrement的调用:
private fun savetosqlite(coinListesi: List<CoinInfo>){ launch{ val dao = CoinInfoDatabase(getApplication()).coinDao() dao.deleteAll() dao.resetAutoIncrement() // 重置自增序列 val uuidList = dao.insertAll(*coinListesi.toTypedArray()) } }
解决方法二:重建表(不推荐)
如果需要彻底清空表并重置所有状态,可以删除表后重新创建,但这种方法效率低,且需要手动同步Entity的表结构,维护成本高,仅在特殊场景下使用:
@Dao interface CoinInfoDao { // ... 原有方法 @Query("DROP TABLE IF EXISTS CoinInfo") suspend fun dropTable() // 注意:建表语句要和@Entity定义的结构完全一致,后续Entity修改时需同步更新 @Query("CREATE TABLE CoinInfo (uuid INTEGER PRIMARY KEY AUTOINCREMENT, ...);") suspend fun recreateTable() }
调用时先删除表,再重建:
private fun savetosqlite(coinListesi: List<CoinInfo>){ launch{ val dao = CoinInfoDatabase(getApplication()).coinDao() dao.dropTable() dao.recreateTable() val uuidList = dao.insertAll(*coinListesi.toTypedArray()) } }
可选方案:忽略该问题
自增主键的核心作用是保证每行数据的唯一性,只要主键唯一,是否从0开始并不会影响功能实现。如果业务上没有强制要求主键从0递增,可以不用做任何处理。
内容的提问来源于stack exchange,提问作者Arafin
相关产品推荐
相关产品推荐

