42

Android 4.2では、SQLite 3.7.11を使用して、下のスキーマであるクイズテーブルから行を削除しても、QuizQuestionsテーブルの対応する行は削除されません。

何が悪いのかわかりません。入れてみました

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

createtableステートメントの前後。

テーブルステートメントを作成します。

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

4 に答える 4

77

quizQuestions誰かが から、quizzesまたは から行を削除する場合に備えて、データベースは から行を削除する必要がありquestionsます。外部キーのサポートがオフになっていて、任意の値を含むことができる通常の列だけがある場合、外部キー制約全体が無視されます。

SQLiteは、データベースを開くPRAGMA foreign_keys = OFFたびにデフォルトになります。テーブルやスキーマのプロパティではありません。

使用する場合はSQLiteOpenHelperに入れますonOpen。これは、データベースが開かれるたびに呼び出される場所です。onCreateデータベースの作成時に一度だけ。


初めてSQLiteOpenHelper電話をかけたときの電話はgetWriteableDatabase

  1. onConfigure毎回、API レベル >= 16 が必要
  2. データベースファイルの存在とバージョンに応じて、以下がトランザクション内で呼び出されます
    • onCreateデータベースファイルがない場合。通常、これはアプリの有効期間全体で 1 回だけ発生します。
    • onUpgradeデータベースのバージョン ( PRAGMA user_version- データベース ファイル内に保存) が、SQLiteOpenHelper のコンストラクターで指定されたバージョンよりも小さい場合。コードでバージョンを変更するたびに発生します。
    • ファイルが存在し、バージョンが一致する場合は何もしません。
  3. onOpen毎回

の同じインスタンスがSQLiteOpenHelper既に開いているデータベースを持っている場合は、それを返すだけで、上記のことは何も起こりません。

于 2012-11-30T08:31:21.510 に答える
30

Android アプリでデータベースを開いた直後にこれを追加してみてください。

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

ON DELETE CASCADEこれにより、 が正しく機能するために必要な外部キーのサポートがオンになります。

于 2012-11-30T08:20:01.253 に答える
10

Sqlite はデフォルトで外部キー制約を無効にするため、以下のように DBhelper クラスで onOpen メソッドをオーバーライドするだけで有効にする必要があります

public class YourOwnDbHelper extends SQLiteOpenHelper {
    @Override
    public void onOpen(SQLiteDatabase db){
        super.onOpen(db);
        db.execSQL("PRAGMA foreign_keys=ON");
    }
}
于 2015-10-09T23:30:03.900 に答える