Contraintes de clé étrangères sur Android utilisant SQLite? sur Supprimer la cascade

J’ai deux tables: les pistes et les waypoints, une piste peut avoir de nombreux waypoints, mais un waypoint est assigné à une seule piste.

Dans le tableau de points, j’ai une colonne appelée “trackidfk” qui insère le track_ID une fois qu’une piste est créée, mais je n’ai pas installé de contraintes de clé étrangère sur cette colonne.

Lorsque je supprime une piste, je souhaite supprimer les waypoints atsortingbués, est-ce possible? J’ai lu à propos de l’utilisation des déclencheurs mais je ne pense pas qu’ils soient supportés dans Android.

Pour créer la table de waypoints:

public void onCreate(SQLiteDatabase db) { db.execSQL( "CREATE TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + LONGITUDE + " INTEGER," + LATITUDE + " INTEGER," + TIME + " INTEGER," + TRACK_ID_FK + " INTEGER" + " );" ); ... } 

Les contraintes de clé étrangère avec cascade de suppression sont sockets en charge, mais vous devez les activer.
Je viens d’append ce qui suit à mon SQLOpenHelper , qui semble faire l’affaire.

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { // Enable foreign key constraints db.execSQL("PRAGMA foreign_keys=ON;"); } } 

J’ai déclaré ma colonne de référencement comme suit.

 mailbox_id INTEGER REFERENCES mailboxes ON DELETE CASCADE 

Depuis Android 4.1 (API 16), SQLiteDatabase prend en charge:

 public void setForeignKeyConstraintsEnabled (boolean enable) 

Comme le post de e.shishkin le dit de l’API 16, vous devez activer les contraintes de clé étrangère dans la SqLiteOpenHelper.onConfigure(SqLiteDatabase) à l’aide de db.setForeignKeyConstraintsEnabled(boolean)

 @Override public void onConfigure(SQLiteDatabase db){ db.setForeignKeyConstraintsEnabled(true); } 

Jamais trop vieux d’une question pour répondre avec une réponse plus complète.

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { setForeignKeyConstraintsEnabled(db); } mOpenHelperCallbacks.onOpen(mContext, db); } private void setForeignKeyConstraintsEnabled(SQLiteDatabase db) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { setForeignKeyConstraintsEnabledPreJellyBean(db); } else { setForeignKeyConstraintsEnabledPostJellyBean(db); } } private void setForeignKeyConstraintsEnabledPreJellyBean(SQLiteDatabase db) { db.execSQL("PRAGMA foreign_keys=ON;"); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void setForeignKeyConstraintsEnabledPostJellyBean(SQLiteDatabase db) { db.setForeignKeyConstraintsEnabled(true); } 

Tout ce que @phil mentionné est bon. Mais vous pouvez utiliser une autre méthode par défaut disponible dans la firebase database elle-même pour définir la clé étrangère. C’est setForeignKeyConstraintsEnabled (true).

 @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); if (!db.isReadOnly()) { // Enable foreign key constraints db.execSQL("PRAGMA foreign_keys=ON;"); //(OR) db.setForeignKeyConstraintsEnabled (true) } } 

Pour les documents, reportez-vous à SQLiteDatabase.setForeignKeyConstraintsEnabled.

Je ne pense pas que SQLite le prenne en charge Ce que je fais dans mes applications est:

  1. Créer une transaction
  2. Supprimer des données détaillées (points de cheminement dans votre exemple)
  3. Supprimer les données de base (pistes dans votre exemple)
  4. Commettre une transaction en cas de succès

De cette façon, je suis sûr que toutes les données sont supprimées ou aucune.

Les déclencheurs sont pris en charge par Android et ce type de suppression en cascade n’est pas pris en charge par sqlite. Un exemple d’utilisation des déclencheurs sur Android peut être trouvé ici . Bien que Thorsten ait déclaré utiliser des transactions est probablement aussi simple qu’un déclencheur.

La version de SQLite dans Android 1.6 est 3.5.9 ainsi elle ne supporte pas les clés étrangères …

http://www.sqlite.org/foreignkeys.html “Ce document décrit la prise en charge des contraintes de clé étrangère SQL introduites dans SQLite version 3.6.19.”

Dans Froyo, c’est SQLite version 3.6.22, alors …

EDIT: pour voir la version de sqlite: adl shell sqlite3 -version

Les clés étrangères avec “on delete cascade” sont supscopes dans SQLite sous Android 2.2 et supérieur. Mais soyez prudent lorsque vous les utilisez: une erreur est parfois signalée lors du lancement d’une clé étrangère sur une colonne, mais le véritable problème réside dans une autre contrainte de clé étrangère de colonne dans la table enfant ou dans une autre table faisant référence à cette table.

On dirait que SQLite vérifie toutes les contraintes lors du lancement de l’une d’entre elles. Il est en fait mentionné dans la documentation. Vérification des contraintes DDL et DML.