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
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.
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);
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"));