J'ai deux tableaux: les traces et les waypoints, une trace peut avoir plusieurs waypoints, mais un waypoint est assigné à une seule trace.
Dans le tableau des points de chemin, 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 configuré de contraintes de clé étrangère sur cette colonne.
Lorsque je supprime une trace, je veux supprimer les waypoints attribués, est-ce possible?. J'ai lu sur l'utilisation des déclencheurs mais je ne pense pas qu'ils soient pris en charge par Android.
Pour créer la table des 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"
+ " );"
);
...
}
la source
PRAGMA
déclarations dansonConfigure()
mais cela nécessite le niveau d'API 16 (Android 4.1), et d'ici là, vous pouvez simplement appelersetForeignKeyConstraintsEnabled
.onCreate
/onDowngrade
/onUpgrade
, qui sont antérieuresonOpen
. Voir le code source dans Android 4.1.1 .Depuis Android 4.1 (API 16), SQLiteDatabase prend en charge:
la source
Comme le message de e.shishkin le dit à partir de l'API 16, vous devez activer les contraintes de clé étrangère dans la
SqLiteOpenHelper.onConfigure(SqLiteDatabase)
méthode en utilisant ledb.setForeignKeyConstraintsEnabled(boolean)
la source
Jamais une question trop ancienne pour y répondre par une réponse plus complète.
la source
Tout ce que @phil a mentionné est bon. Mais vous pouvez utiliser une autre méthode par défaut disponible dans la base de données elle-même pour définir la clé étrangère. C'est setForeignKeyConstraintsEnabled (true).
Pour les documents, reportez-vous à SQLiteDatabase.setForeignKeyConstraintsEnabled
la source
A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback.
Donc, au lieu deonOpen
,onConfigure
semble être le bon endroit.Je ne pense pas que SQLite prenne en charge cela hors de la boîte. Ce que je fais dans mes applications, c'est:
De cette façon, je suis sûr que toutes les données sont supprimées ou aucune.
la source
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 de déclencheurs sur Android peut être trouvé ici . Bien que l'utilisation de transactions, comme l'a déclaré Thorsten, est probablement aussi simple qu'un déclencheur.
la source
La version de SQLite dans Android 1.6 est 3.5.9 donc elle ne prend pas en charge 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 la version 3.6.22 de SQLite, donc ...
EDIT: pour voir la version de sqlite: adb shell sqlite3 -version
la source
Les clés étrangères avec "on delete cascade" sont prises en charge dans SQLite sous Android 2.2 et plus. Mais soyez prudent lorsque vous les utilisez: parfois une erreur est signalée lors du déclenchement d'une clé étrangère sur une colonne, mais le vrai problème réside soit dans une autre contrainte de clé étrangère de colonne dans la table enfant, soit dans une autre table qui fait référence à cette table.
On dirait que SQLite vérifie toutes les contraintes lors de l'activation de l'une d'entre elles. Il est en fait mentionné dans la documentation. Vérifications de contraintes DDL et DML.
la source
Si vous utilisez Android Room, procédez comme indiqué ci-dessous.
la source