Android机房 - 如何清除所有表的sqlite_sequence

时间:2018-03-28 10:21:19

标签: android android-sqlite android-room

如果用户从应用程序注销,我将使用

逐个清除表中的数据
@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。

还有其他办法吗?我试图清除整个数据库,并在用户再次登录后添加新条目。

3 个答案:

答案 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