2011-03-13 19 views
48

私はAndroidのSQLiteデータベース内で外部キーを処理しようとしています。私は次の構文を試してみましたが、それは私に力を与えてくれます。SQlite - Android - 外部キー構文

private static final String TASK_TABLE_CREATE = "create table " 
      + TASK_TABLE + " (" + TASK_ID 
      + " integer primary key autoincrement, " + TASK_TITLE 
      + " text not null, " + TASK_NOTES + " text not null, " 
    + TASK_DATE_TIME + " text not null, FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"));"; 

私は間違っていると思いますか?他のテーブル構造を見る必要がある場合は、IDと名前を持つ2番目のテーブルの構造だけです。

編集:

ここではエラーです:

03-13 13:42:35.389: ERROR/AndroidRuntime(312): Caused by: android.database.sqlite.SQLiteException: unknown column "taskCat" in foreign key definition: create table reminders (_id integer primary key autoincrement, task_title text not null, notes text not null, reminder_date_time text not null, FOREIGN KEY (taskCat) REFERENCES category (_id));

答えて

99

あなたが最初にあなたのTASK_CAT列を定義し、それに外部キーを設定する必要があります。

private static final String TASK_TABLE_CREATE = "create table " 
     + TASK_TABLE + " (" 
     + TASK_ID + " integer primary key autoincrement, " 
     + TASK_TITLE + " text not null, " 
     + TASK_NOTES + " text not null, " 
     + TASK_DATE_TIME + " text not null," 
     + TASK_CAT + " integer," 
     + " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+"("+CAT_ID+"));"; 

さらに詳しい情報は、sqliteの外部キーdocを参照してください。

+5

この解決策は私にとっては役に立たなかった。私が見つけた解決策は、すべてを1行で定義することでしたが、構文が少し異なりました。私は最後の2行の代わりにこれを行なった: TASK_CAT + "INTEGER REFERENCES" + CAT_TABLE + ");"; – HotN

+0

@HotN、あなたは正しい友達です。あなたの解決策も私のために働いた。ありがとう – blueware

+0

@jetho私は親キーがすべての子供の列レコードを削除した後も削除する必要がありますfunctionallityを追加したい。 – UnKnown

1

テーブルに列(_id、tast_title、notes、reminder_date_time)が含まれていて、 "taskCat"列から外部キーを追加しようとしていますが、テーブルに存在しません。

9

私はコメントできませんので、このメモを@jethroの回答に追加してください。

テーブルステートメントの作成の最後の部分としてFOREIGN KEY行を実行する必要があることがわかりました。そうしないと、アプリケーションのインストール時に構文エラーが発生します。つまり、次のようなことはできません。

private static final String TASK_TABLE_CREATE = "create table " 
    + TASK_TABLE + " (" + TASK_ID 
    + " integer primary key autoincrement, " + TASK_TITLE 
    + " text not null, " + TASK_NOTES + " text not null, " 
+ TASK_CAT + " integer," 
+ " FOREIGN KEY ("+TASK_CAT+") REFERENCES "+CAT_TABLE+" ("+CAT_ID+"), " 
+ TASK_DATE_TIME + " text not null);"; 

ここで、外部キー行の後にTASK_DATE_TIMEを挿入します。