web-dev-qa-db-ja.com

SQlite-Android-外部キーの構文

私はAndroid SQLiteデータベース内で外部キーを機能させようとしました。次の構文を試しましたが、強制的に近くなります:

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:エラー/ AndroidRuntime(312):原因:Android.database.sqlite.SQLiteException:外部キー定義の不明な列 "taskCat":テーブルリマインダーの作成(_id整数主キーの自動インクリメント、task_titleテキストはありませんnull、null以外のテキスト、null以外のreminder_date_timeテキスト、外部キー(taskCat)REFERENCESカテゴリ(_id));

50
user319940

最初に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 で詳細を確認できます。

104
jethro

コメントできないので、@ jethroの回答に加えてこのメモを追加します。

Tableステートメントを作成する最後の部分として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を配置した場所。

10
nommer

エラーの説明でわかるように、テーブルには列(_id、tast_title、notes、reminder_date_time)が含まれており、列「taskCat」から外部キーを追加しようとしていますが、テーブルには存在しません!

2
aweis