无法使用RoomDatabase.query更新sqlite_sequence表

时间:2018-12-01 18:19:26

标签: android android-room

我们尝试使用以下代码更新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

5 个答案:

答案 0 :(得分:1)

Room不使用SQLiteDatabase-而是使用SupportSQLiteDatabase,虽然它是source code状态,但它delegates all calls to an implementation of {@link SQLiteDatabase} ...我什至可以挖掘进一步-但我确信这是一个一致性功能,而不是错误。

SQLiteDatabase.execSQL()仍然可以正常工作,但是使用SupportSQLiteDatabase.execSQL()对内部表进行相同的UPDATEDELETE查询不会产生任何影响,也不会引发错误。

我的MaintenanceHelperGitHub上可用。重要的是,首先要让Room创建数据库,然后才能使用SQLiteDatabase.execSQL()处理内部表。在研究时,我遇到了注释@SkipQueryVerification,它可以可能允许在表UPDATE上使用DELETEsqlite_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);