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);
29
demandé sur Taryn 2012-11-30 12:10:36

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

  1. onConfigure chaque fois, niveau API > = 16 requis
  2. 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.
  3. 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.

54
répondu zapl 2012-11-30 12:47:31

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.

21
répondu mvp 2012-11-30 08:20:01

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");
    }
}
7
répondu Ken Ratanachai S. 2015-10-10 07:42:40

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

0
répondu user3739283 2015-01-20 06:58:25