无法使用RoomDatabase.query更新sqlite_sequence表

Che*_*eng 12 android android-room

我们尝试sqlite_sequence使用以下代码进行更新.

WeNoteRoomDatabase weNoteRoomDatabase = WeNoteRoomDatabase.instance();
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = 'attachment'"));
Run Code Online (Sandbox Code Playgroud)

但是,它完全没有效果.我sqlite_sequence使用SQLite浏览器检查表内容.计数器未重置为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;
    }
}
Run Code Online (Sandbox Code Playgroud)

知道我们错过了什么吗?


附加信息:清除sqlite_sequence在android机房中不起作用

Mar*_*ler 2

Room不使用SQLiteDatabase - 但它使用SupportSQLiteDatabase,而它的源代码表明,它delegates all calls to an implementation of {@link SQLiteDatabase}......我什至可以进一步挖掘 - 但我确信,这是一个一致性功能而不是错误。

SQLiteDatabase.execSQL()仍然可以正常工作,但是使用SupportSQLiteDatabase.execSQL()相同的UPDATEDELETE对内部表的查询没有效果并且不会抛出错误。

我的MaintenanceHelper可以在GitHub上找到。重要的是,一开始就Room创建数据库,然后可以使用SQLiteDatabase.execSQL(). 在研究时我遇到了注释@SkipQueryVerification,它可能允许UPDATEDELETE表上sqlite_sequence;我只设法执行了SELECTwith ...,从公开可用的 API 的角度来看,Dao一般来说,内部表的所有提示都被视为;read-only所有的操纵尝试都被默默地忽略。