2012-02-29 24 views
2

私はSQLiteデータベースをサポートするAndroid 2.2以上のアプリを開発しています。テーブルの作成中に参照整合性制約を定義しようとしています。私はonCreatedb.execSQL("PRAGMA foreign_keys=ON;");SQLiteOpenHelperonOpenのメソッドを実行することによって、外部キーのサポートも有効にしました。私のテーブルと適切な外部キー参照を設定すると、参照レコードが存在しないテーブルのinsert行に移動できます。例えば、私は、外部キーが正しくQues_Ansテーブルに設定されている場合とQuestionsテーブル内のレコードがないよう、第二の挿入が失敗している必要がありますAndroid 2.2 + SQLite +参照整合性制約の定義

表に
INSERT INTO Questions VALUES(1, 'Some text'); 
INSERT INTO Ques_Ans(qid, aid, is_correct) VALUES(20, 1, 0); 

を構造

CREATE TABLE Questions(_id integer primary key,question text not null); 
CREATE TABLE Ques_Ans(_id integer primary key autoincrement,qid integer not null, 
         aid integer not null,is_correct integer default 0, 
         FOREIGN KEY (qid) REFERENCES Questions(_id)); 

と私のデータを以下のように次ましたid 20しかし、どういうわけか私のアプリは何のエラーもスローされず、2番目の挿入ステートメントが挿入されます。誰も私に何が間違っているか教えてもらえますか?

アップデート[03日 - 3月-2012]:@Catcall

  • とのディスカッションスレッド後sqlite3ツールを使用して、エミュレータ上または上のアプリを経由して使用した場合に予想される
  • 同じこととしてPRAGMA foreign_keys=ON;外部キー作品に切り替え電話が動作しない
  • insert()またはexecSQL()を使用して実行される文を挿入します。いずれも投げられませんforeign key constraint failedエラー
  • PRAGMA integrity_check返信okです。したがって、データベースは壊れていません。
+0

+1問題を再現するために必要なすべてのSQLが含まれているためです。 –

+0

今後の読者へのお知らせ2015年と同じこと –

答えて

1

外部キーは列 "_id"ではなく、 "qid"列にあります。

このINSERT文

INSERT INTO Ques_Ans VALUES(20, 1, 0); 

このINSERTは成功するはずのエラー

Error: table Ques_Ans has 4 columns but 3 values were supplied 

を投げている必要があります。

INSERT INTO Ques_Ans VALUES(20, 1, 0, 0); 

これは失敗します。その後

INSERT INTO Ques_Ans VALUES(21, 2, 0, 0); 
Error: foreign key constraint failed 

。 。 。

これはsqliteでは動作しますが、エミュレータでは動作しないため、問題はエミュレータまたはコードのいずれかにある可能性があります。

これは、データベーストランザクションのイディオムです。

db.beginTransaction(); 
    try { 
    ... 
    db.setTransactionSuccessful(); 
    } finally { 
    db.endTransaction(); 
    } 

Androidのドキュメントはinsert()代わりのexecSQL()を使用することをお勧め。エラーを返す可能性があるすべての関数で、トラップ、キャッチ、またはエラーをチェックしていることを確認してください。たとえば、insert()に切り替えると、-1の戻り値を確認します。

これは役に立たない場合は、この質問に「Java」などのタグを付けるか、コードに重点を置く新しい質問をしてエラーをキャッチしてみてください。

+0

ありがとう@キャットコール。もともと私は間違った挿入クエリをタイプしました。元の質問を編集して修正しました。 – Jay

+0

明らかに、参照整合性の問題は依然として存在します。質問の変更は投稿のためだけで、私の実際のコードには問題を修正したときの挿入スクリプトがあります。この問題の助けを歓迎します。 – Jay

+0

@Jay:編集したクエリはここでは失敗します。「エラー:外部キー制約に失敗しました。 'PRAGMA integrity_check;'を実行して、データベースが壊れていないかどうか確認してください。 –

0

IN SQLite外部キー制約は、既定で無効にされています(下位互換性のため)。データベースとの接続を確立した後、

PRAGMA foreign_keys = 1 を明示的に有効にする必要があります。ここでそれをより深く説明する公式ドキュメントへのリンクがあります。 http://sqlite.org/foreignkeys.html上記のリンクで外部キーを有効にするに移動してください。

関連する問題