Android 4.2、SQLite 3.7.11を使用して、Quizzesテーブルからスキーマを下にある行を削除すると、QuizQuestionsテーブルの対応する行が削除されません。
何が悪いのかわからない。入れてみました
db.execSQL("PRAGMA foreign_keys = ON;");
create 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);
誰かがquizQuestions
またはquizzes
から削除している場合、データベースはquestions
から行を削除する必要があります。外部キーのサポートがオフになっていて、任意の値を含むことができる通常の列しかない場合、entire外部キー制約は無視されます。
SQLiteのデフォルトはPRAGMA foreign_keys = OFF
毎回openデータベース。これは、テーブルまたはスキーマのプロパティではありません。
SQLiteOpenHelper
を使用する場合は、onOpen
に入れてください。これは、データベースが開かれるたびに呼び出される場所です。 onCreate
は、データベースの作成時に一度だけです。
SQLiteOpenHelper
を初めて呼び出すときにgetWriteableDatabase
が呼び出すのは
onConfigure
毎回、APIレベル> = 16が必要onCreate
データベースファイルがない場合。通常、これが発生するのは、アプリの存続期間全体で1回だけです。onUpgrade
データベースのバージョン(PRAGMA user_version
-データベースファイル内に保存)は、SQLiteOpenHelperのコンストラクタで提供されるバージョンよりも小さいです。コードでバージョンをバンプするたびに発生します。onOpen
毎回SQLiteOpenHelper
の同じインスタンスがすでに開いているデータベースを持っている場合、それはそれを返すだけで、上記の何も起こりません。
Androidアプリでデータベースを開いた直後にこれを追加してみてください:
db.execSQL("PRAGMA foreign_keys=ON");
これにより、外部キーのサポートがオンになります。これは、ON DELETE CASCADE
が正しく機能するために必要です。
Sqliteはデフォルトで外部キー制約を無効にするため、次のようにして有効にする必要があります以下のように、DBhelperクラスのonOpenメソッドを単にオーバーライドします
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
visual Basicでも同じ問題が発生しました!!!次のようにコマンドテキストを記述する必要があります。
cone.CommandText = "PRAGMA foreign_keys = ON; DELETE FROM employees WHERE cod_emp = 0;"
何かを削除するたびにそれをしなければなりません