webentwicklung-frage-antwort-db.com.de

SQLite Delete Cascade funktioniert nicht

Wenn ich in Android 4.2 mit SQLite 3.7.11 eine Zeile aus der Quizetabelle lösche, deren Schema darunter ist, werden die entsprechenden Zeilen in der QuizQuestions-Tabelle nicht gelöscht.

Ich kann nicht herausfinden, was falsch ist. Ich habe versucht zu setzen 

db.execSQL("PRAGMA foreign_keys = ON;"); 

vor und nach den create table-Anweisungen.

Erstellen Sie Tabellenanweisungen:

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);
30
Dan14021

Ihre Datenbank sollte Zeilen aus quizQuestions löschen, falls jemand aus quizzes oder aus questions löscht. Die Fremdschlüsseleinschränkung gesamt wird ignoriert, wenn die Fremdschlüsselunterstützung deaktiviert ist und Sie nur reguläre Spalten haben, die beliebige Werte enthalten können.

SQLite ist standardmäßig PRAGMA foreign_keys = OFF jedes Mal, wenn Sie öffnen die Datenbank _. Es ist keine Eigenschaft einer Tabelle oder des Schemas.

Falls Sie SQLiteOpenHelper verwenden, setzen Sie es in onOpen. Dies ist der Ort, der jedes Mal aufgerufen wird, wenn die Datenbank geöffnet wird. onCreate nur einmal beim Erstellen der Datenbank.


Was SQLiteOpenHelper aufruft, wenn Sie getWriteableDatabase zum ersten Mal aufrufen, ist

  1. onConfigure jedes Mal ist API-Level> = 16 erforderlich
  2. abhängig von Existenz und Version der Datenbankdatei wird Folgendes innerhalb einer Transaktion aufgerufen
    • onCreate wenn keine Datenbankdatei vorhanden ist. Dies geschieht normalerweise nur einmal während der gesamten Lebensdauer der App.
    • onUpgrade, wenn die Datenbankversion (PRAGMA user_version - in der Datenbankdatei gespeichert) kleiner ist als die im Konstruktor von SQLiteOpenHelper angegebene Version. Geschieht jedes Mal, wenn Sie die Version in Ihrem Code stoßen.
    • Nichts, wenn eine Datei existiert und die Version übereinstimmt.
  3. onOpen jedes Mal

Wenn dieselbe Instanz von SQLiteOpenHelper bereits über eine offene Datenbank verfügt, wird sie nur zurückgegeben, und nichts davon geschieht.

58
zapl

Versuchen Sie, diese direkt nach dem Öffnen der Datenbank in Ihrer Android-App hinzuzufügen:

db.execSQL("PRAGMA foreign_keys=ON");

Dadurch wird die Unterstützung für Fremdschlüssel aktiviert. Dies ist erforderlich, damit ON DELETE CASCADE ordnungsgemäß funktioniert. 

22
mvp

Da Sqlite die Fremdschlüsseleinschränkung standardmäßig deaktiviert, müssen Sie sie aktivieren, indem Sie einfach die onOpen-Methode in Ihrer DBhelper-Klasse überschreiben, wie unten.

public class YourOwnDbHelper extends SQLiteOpenHelper {
    @Override
    public void onOpen(SQLiteDatabase db){
        super.onOpen(db);
        db.execSQL("PRAGMA foreign_keys=ON");
    }
}
7

ich hatte das gleiche Problem mit Visual Basic !!! Sie müssen den Befehlstext so schreiben:

cone.CommandText = "PRAGMA foreign_keys = ON; DELETE FROM Mitarbeiter WHERE cod_emp = 0;"

und Sie müssen es jedes Mal tun, wenn Sie etwas löschen

0
user3739283