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)
知道我们错过了什么吗?
Room不使用SQLiteDatabase - 但它使用SupportSQLiteDatabase,而它的源代码表明,它delegates all calls to an implementation of {@link SQLiteDatabase}......我什至可以进一步挖掘 - 但我确信,这是一个一致性功能而不是错误。
SQLiteDatabase.execSQL()仍然可以正常工作,但是使用SupportSQLiteDatabase.execSQL()相同的UPDATE或DELETE对内部表的查询没有效果并且不会抛出错误。
我的MaintenanceHelper可以在GitHub上找到。重要的是,一开始就Room创建数据库,然后可以使用SQLiteDatabase.execSQL(). 在研究时我遇到了注释@SkipQueryVerification,它可能允许或UPDATE在DELETE表上sqlite_sequence;我只设法执行了SELECTwith ...,从公开可用的 API 的角度来看,Dao一般来说,内部表的所有提示都被视为;read-only所有的操纵尝试都被默默地忽略。
| 归档时间: |
|
| 查看次数: |
734 次 |
| 最近记录: |