我们尝试使用以下代码更新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
答案 0 :(得分:1)
Room
不使用SQLiteDatabase-而是使用SupportSQLiteDatabase,虽然它是source code状态,但它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
;从公开的API角度来看,我只设法对SELECT
执行了Dao
...,通常将内部表的所有提示都视为read-only
。所有的操作尝试都将被静默忽略。
答案 1 :(得分:0)
我认为查询是错误的,您应该在查询下面尝试
weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));
答案 2 :(得分:0)
表sql_sequence
不是由Room管理的,因此您需要使用SupportSQLiteDatabase
对其进行编辑。
尝试一下:
String sqlQuery = "DELETE FROM sqlite_sequence WHERE name='attachment'";
weNoteRoomDatabase().getOpenHelper().getWritableDatabase().query(sqlQuery);
答案 3 :(得分:0)
我正在使用会议室数据库版本2.2.5
在这里,我无法使用Room Dao结构执行此查询,因此像这样创建一个简单的类和访问方法,我获得了成功的结果,因此该结果是经过测试的结果。我正在使用RxJava和RxAndroid。
public class SqlHelper {
private static SqlHelper helper = null;
public static SqlHelper getInstance() {
if (helper == null) {
helper = new SqlHelper();
}
return helper;
}
public Completable resetSequence(Context context) {
return Completable.create(emitter -> {
try {
AppDatabase.getDatabase(context)
.getOpenHelper()
.getWritableDatabase()
.execSQL("DELETE FROM sqlite_sequence WHERE name='<YOUR_TABLE_NAME>'");
emitter.onComplete();
} catch (Exception e) {
emitter.onError(e);
}
});
}
}
Execute:
SqlHelper.getInstance()
.resetQuizSequence(context)
.subscribeOn(Schedulers.io()
.observeOn(AndroidSchedulers.mainThread())
.subscribe(() -> {}, error -> {});
答案 4 :(得分:0)
这对我有用 - Room 2.2.6
String sqlQuery = "DELETE FROM sqlite_sequence WHERE name='attachment'";
<YourDatabase>.getInstance(mContext).getOpenHelper().getWritableDatabase().execSQL(sqlQuery);