SQLite Delete Cascade ne fonctionne pas
Dans Android 4.2, en utilisant SQLite 3.7.11, lorsque je supprime une ligne de la table Quiz, le schéma de qui est ci-dessous, les lignes correspondantes de la table QuizQuestions ne sont pas supprimées.
Je n'arrive pas à comprendre ce qui ne va pas. J'ai essayé de mettre
db.execSQL("PRAGMA foreign_keys = ON;");
Avant et après les instructions create table.
Créer des instructions de table:
CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE);
CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER,
PRIMARY KEY(quiz_name, question_id),
FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE,
FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE);
4 réponses
Votre base de données doit supprimer des lignes de quizQuestions
au cas où quelqu'un supprimerait de quizzes
ou de questions
. Il ignorera la contrainteentire foreign key au cas où la prise en charge de la clé étrangère serait désactivée et que vous n'auriez que des colonnes régulières pouvant contenir n'importe quelle valeur.
SQLite vaut par défaut PRAGMA foreign_keys = OFF
chaque fois que vous ouvrez La base de données. Ce n'est pas une propriété d'un tableau ou de schéma.
Dans le cas où vous utilisez SQLiteOpenHelper
mettre dans onOpen
. C'est l'endroit qui est appelée à chaque heure d'ouverture de la base de données. onCreate
une seule fois lorsque la base de données est créée.
Ce SQLiteOpenHelper
appels lorsque vous appelez getWriteableDatabase
, pour la première fois
-
onConfigure
chaque fois, niveau API > = 16 requis - selon l'existence et la version du fichier de base de données, ce qui suit est appelé dans une transaction
-
onCreate
s'il n'y a pas de fichier de base de données. En règle générale, cela ne se produit qu'une seule fois dans toute la durée de vie de l'application. -
onUpgrade
si la version de la base de données (PRAGMA user_version
- enregistré dans le fichier de base de données) est inférieur à la version fournie dans le constructeur de SQLiteOpenHelper. Arrive chaque fois que vous cognez la version dans votre code. - rien si le fichier existe et la version correspond.
-
-
onOpen
chaque fois
Si la même instance de SQLiteOpenHelper
a déjà une base de données ouverte, elle la renverra et rien de ce qui précède ne se passera.
Essayez d'ajouter ceci juste après l'ouverture de la base de données dans votre application Android:
db.execSQL("PRAGMA foreign_keys=ON");
Cela active la prise en charge des clés étrangères, ce qui est nécessaire pour que ON DELETE CASCADE
fonctionne correctement.
Sqlite désactiver la contrainte de clé étrangère par défaut, vous devez donc l'activer par simplement remplacer la méthode onOpen dans votre classe DBhelper comme ci-dessous
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
J'ai eu le même problème sur visual basic!!! vous devez écrire le texte de la commande comme ceci:
Cône.CommandText = " PRAGMA foreign_keys = ON; Supprimer des employés Où cod_emp=0; "
Et vous devez le faire chaque fois que vous supprimez quelque chose