web-dev-qa-db-fra.com

Impossible de mettre à jour la table sqlite_sequence à l'aide de RoomDatabase.query

Nous essayons de mettre à jour sqlite_sequence avec le code suivant.

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

Cependant, cela n'a aucun effet. J'examine le contenu de la table sqlite_sequence à l'aide du navigateur SQLite. Le compteur n'est pas remis à 0.

Si nous essayons d'exécuter manuellement la même requête à l'aide du navigateur SQLite sur le même fichier SQLite, cela fonctionne parfaitement.

Notre base de données de salle est assez simple.

@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;
    }
}

Une idée de ce que nous avions manqué?


Informations supplémentaires: la suppression de sqlite_sequence ne fonctionne pas dans la salle Android

12
Cheok Yan Cheng

Room n'utilise pas SQLiteDatabase - mais utilise SupportSQLiteDatabase , bien qu'il s'agisse de code source déclare qu'il delegates all calls to an implementation of {@link SQLiteDatabase}... Je pourrais même creuser davantage - mais je suis convaincu que cela est une fonctionnalité de cohérence et non un bug.

SQLiteDatabase.execSQL() fonctionne toujours bien, mais avec SupportSQLiteDatabase.execSQL() les mêmes requêtes UPDATE ou DELETE concernant les tables internes n’ont aucun effet et ne génèrent pas d’erreurs.

ma MaintenanceHelper est disponible sur GitHub . Il est important de laisser au départ Room créer la base de données. Ensuite, vous pouvez manipuler les tables internes avec SQLiteDatabase.execSQL(). lors de mes recherches, je suis tombé sur l'annotation @SkipQueryVerification , qui pourrait éventuellement permettre UPDATE ou DELETE sur la table sqlite_sequence; J'ai seulement réussi à exécuter une SELECT avec Dao... qui, en général, toutes les astuces relatives aux tables internes sont traitées comme read-only, du point de vue de l'API disponible au public; toutes les tentatives de manipulation sont ignorées en silence.

1
Martin Zeitler

La table sql_sequence n'est pas gérée par Room, vous devez donc la modifier à l'aide de SupportSQLiteDatabase.

Essaye ça:

String sqlQuery = "DELETE FROM sqlite_sequence WHERE name='attachment'";

weNoteRoomDatabase().getOpenHelper().getWritableDatabase().query(sqlQuery);
0
Tjaart

je pense que la requête est fausse, vous devriez essayer la requête ci-dessous 

weNoteRoomDatabase.query(new SimpleSQLiteQuery("UPDATE sqlite_sequence SET seq = 0 WHERE name = attachment"));
0
Mayur Dabhi