如果用户从应用程序注销,我将使用
逐个清除表中的数据@Query("DELETE FROM tableName")
然后我试图使用下面的代码逐个清除所有表的sqlite_sequence。
database = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, DatabaseMeta.DB_NAME)
.build();
database.query("DELETE FROM sqlite_sequence WHERE name = ?", new Object[]{"tableName"})
不幸的是,清除sqlite_sequence
无效。因此,如果用户再次登录,则不会从1创建起始rowId。
还有其他办法吗?我试图清除整个数据库,并在用户再次登录后添加新条目。
答案 0 :(得分:1)
如此answer中所述,您可以使用下一个查询:
UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"
此查询将seq设置为Tbl表中col标识列中的最大值,因此不存在违反约束的风险。
答案 1 :(得分:1)
看来,无论是通过DAO还是通过原始查询,Room数据库都不支持编辑sqlite_sequence表。相反,这是我解决此问题的方法(科特琳):
class NonRoomDb(context:Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
override fun onCreate(db: SQLiteDatabase?) {}
override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {}
}
fun resetPointer(context:Context, tableName:String) {
val nonRoomDb = NonRoomDb(context)
nonRoomDb.writableDatabase.execSQL("DELETE FROM sqlite_sequence WHERE name='$tableName';")
nonRoomDb.close()
}
答案 2 :(得分:0)
我发现从sqlite_sequence
删除所有表的一种快速简便的方法正在执行
DELETE FROM sqlite_sequence
在您的SupportSQLiteDatabase
覆盖的execSQL()
方法(或RoomDatabase.Callback
方法)中使用onOpen
的{{1}}方法。
赞:
onCreate