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);
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
onConfigure
jedes Mal ist API-Level> = 16 erforderlichonCreate
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.onOpen
jedes MalWenn dieselbe Instanz von SQLiteOpenHelper
bereits über eine offene Datenbank verfügt, wird sie nur zurückgegeben, und nichts davon geschieht.
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.
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");
}
}
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