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
方法)中使用 SupportSQLiteDatabase
的 execSQL()
方法。
像这样:
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...
}
};
如果用户从应用程序注销,我将使用
逐一清除 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
方法)中使用 SupportSQLiteDatabase
的 execSQL()
方法。
像这样:
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...
}
};