我们尝试使用以下代码更新 sqlite_sequence
。
WeNoteRoomDatabase weNoteRoomDatabase = WeNoteRoomDatabase.instance();
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'attachment'"));
然而,它根本没有作用。我使用 SQLite 浏览器检查 sqlite_sequence
表内容。计数器不会重置为 0。
如果我们尝试在同一个 SQLite 文件上使用 SQLite 浏览器手动运行相同的查询,它工作得很好。
我们的房间数据库非常简单。
@Database(
entities = {Attachment.class},
version = 6
)
public abstract class WeNoteRoomDatabase extends RoomDatabase {
private volatile static WeNoteRoomDatabase INSTANCE;
private static final String NAME = "wenote";
public abstract AttachmentDao attachmentDao();
public static WeNoteRoomDatabase instance() {
if (INSTANCE == null) {
synchronized (WeNoteRoomDatabase.class) {
if (INSTANCE == null) {
INSTANCE = Room.databaseBuilder(
WeNoteApplication.instance(),
WeNoteRoomDatabase.class,
NAME
)
.build();
}
}
}
return INSTANCE;
}
}
知道我们错过了什么吗?
附加信息:clearing sqlite_sequence is not working in android room
最佳答案
房间
不使用 SQLiteDatabase - 但它使用 SupportSQLiteDatabase , 而它是 source code声明,它将所有调用委托(delegate)给 {@link SQLiteDatabase}
的实现......我什至可以进一步挖掘 - 但我相信,这是一个一致性功能而不是错误。
SQLiteDatabase.execSQL()
仍然工作正常,但是使用 SupportSQLiteDatabase.execSQL()
相同的 UPDATE
或 DELETE
对内部表的查询没有效果,也不会抛出错误。
我的 MaintenanceHelper
在 GitHub 上可用.重要的是一开始让 Room
创建数据库 - 然后可以使用 SQLiteDatabase.execSQL()
操作内部表。在研究时我遇到了注释 @SkipQueryVerification ,这可能可能允许UPDATE
或DELETE
表sqlite_sequence
;我只设法用 Dao
执行了一个 SELECT
... 通常,内部表的所有提示都被视为 只读
,从公开可用的API的角度来看;所有的操纵尝试都被默默地忽略了。
关于android - 无法使用 RoomDatabase.query 更新 sqlite_sequence 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573731/