2
votes

Comment tronquer une table?

J'ai besoin de tronquer une table dans ma base de données de salle. Ou je dois réinitialiser ma clé d'auto-incrémentation à 0. Existe-t-il un moyen de le faire?


0 commentaires

3 Réponses :


0
votes

https://developer.android.com / reference / android / arch / persistence / room / RoomDatabase # clearAllTables ()

Notez que cela se produit sur le fil de discussion principal et supprimera toutes les tables.

Pour effacer une table, vous pouvez ajouter une @Query avec DELETE FROM TableName; VIDE


0 commentaires

0
votes

Il n'y a pas de TRUNCATE dans la salle (SQLite)

Alors exécutez d'abord DELETE FROM TABLE puis exécutez UPDATE SQLITE_SEQUENCE SET SEQ = 0 WHERE NAME = 'TABLE_NAME'; pour réinitialiser le champ AI.

i.e.

@Query("DELETE FROM TABLE_NAME")
    fun deleteTable(): Int

@Query("UPDATE SQLITE_SEQUENCE SET SEQ=0 WHERE NAME='TABLE_NAME'")
    fun resetTable(): Int


1 commentaires

essayez de supprimer de sqlite_sequence où name = 'your_table'; après deleteTable ()



0
votes

Comme @Rasel mentionné, il n'y a pas de TRUNCATE dans la salle. En bref, TRUNCATE TABLE supprime les données de la table et la colonne Identifier est réinitialisée à sa valeur de départ si la table contient une colonne d'identité générée automatiquement. Contrairement à DELETE, qui supprime simplement les données, mais conserve l'identité. Il existe également une autre commande nommée DROP qui supprime une ou plusieurs définitions de table et toutes les données, index, déclencheurs, contraintes et spécifications d'autorisation pour ces tables. mais malheureusement il n'y a pas de support pour TRUNCATE et DROP in Room et il ne connaît que la commande Delete.

Mais il y a encore une fenêtre d'espoir! Selon les documents sqlite, SQLite garde la trace du plus grand ROWID qu'une table ait jamais contenu en utilisant la table spéciale SQLITE_SEQUENCE. La table SQLITE_SEQUENCE est créée et initialisée automatiquement chaque fois qu'une table normale contenant une colonne AUTOINCREMENT est créée. Le contenu de la table SQLITE_SEQUENCE peut être modifié à l'aide d'instructions UPDATE, INSERT et DELETE ordinaires.

Une colonne avec AUTOINCREMENT sera un alias de la colonne rowid qui est utilisée pour identifier de manière unique une ligne. Donc, si vous pouvez modifier cette table, vous pourrez réinitialiser la clé d'auto-incrémentation! (Comme un point SQLite définira la première valeur à 1 et non à 0)

Un autre problème est que le comportement inattendu d'Android Room ne fournit pas d'accès à d'autres tables qui n'ont pas été créées par des classes, comme la table SQLITE_SEQUENCE. Et comme Room n'utilise pas SQLiteDatabase - mais il utilise SupportSQLiteDatabase, il délègue tous les appels à une implémentation de SQLiteDatabase - vous ne pouvez pas utiliser SQLiteDatabase.execSQL () dans ce cas.

Alors ce que je fais dans dans ce cas, une fonction dans la classe Singletone RoomDatabase (par Room + dans Kotlin) est ci-dessous:

        companion object {

        fun resetPointer(nonRoomDb: MyRoomDatabase){

          nonRoomDb.openHelper.writableDatabase.execSQL("DELETE FROM sqlite_sequence")

    }       
}

Merci à tous ces liens:


0 commentaires