Android 房间 - 如何为所有 table 清除 sqlite_sequence

Android room - How to clear sqlite_sequence for all table

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

逐一清除 table 中的数据
@Query("DELETE FROM tableName")

然后我尝试使用下面的代码一一清除所有 table 的 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 无效。所以如果用户再次登录,那么起始rowId不是从1创建的。

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

如本 answer 中所述,您可以使用下一个查询:

UPDATE sqlite_sequence SET seq = (SELECT MAX(col) FROM Tbl) WHERE name="Tbl"

This query will set seq to the largest value in the col identity column in the Tbl table, so there is no risk of violating constraints.

房间数据库似乎不支持通过 DAO 或原始查询编辑 sqlite_sequence table。相反,这是我解决这个问题的方法 (Kotlin):

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()
}

这是非常出乎意料的行为,但是 Android 房间不提供对不是由 类 创建的其他表的访问。如果你想访问它,你应该使用 SQLiteDatabase 因为我有最好的参考 。记录时间后我的问题解决了。

SupportSQLiteDatabase supportSQLiteDatabase = DatabaseRoomClassObj.getOpenHelper().getWritableDatabase();
SQLiteDatabase supportSQLiteDatabase1 = SQLiteDatabase.openOrCreateDatabase(supportSQLiteDatabase.getPath(), null, null);
supportSQLiteDatabase1.execSQL("delete from sqlite_sequence");

编码愉快!!!

我发现从 sqlite_sequence 中删除所有表的一种快速简便的方法是执行

DELETE FROM sqlite_sequence

RoomDatabase.Callback 的重写 onOpen 方法(或 onCreate 方法)中使用 SupportSQLiteDatabaseexecSQL() 方法。

像这样:

private static RoomDatabase.Callback roomCallback = new RoomDatabase.Callback() {
    @Override
    public void onOpen(@NonNull SupportSQLiteDatabase db) {
        super.onOpen(db);
        db.execSQL("DELETE FROM sqlite_sequence");
        // Your code...
    }
};