2011-03-13 35 views
48

Tôi đã cố gắng để có được các phím nước ngoài làm việc trong cơ sở dữ liệu SQLite Android của tôi. Tôi đã thử cú pháp sau nhưng nó cho tôi một lực đóng:SQlite - Android - Cú pháp khóa ngoài

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+"));"; 

Bất kỳ ý tưởng nào tôi có thể làm sai? nếu bạn cần phải xem cấu trúc bảng khác thì tôi có thể, nó chỉ là một cấu trúc rất đơn giản cho cấu trúc thứ hai với một ID và một tên.

Edit:

Dưới đây là lỗi:

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));

Trả lời

99

Bạn phải xác định TASK_CAT cột của bạn đầu tiên và sau đó thiết lập khoá ngoại trên nó.

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+"));"; 

Thông tin khác bạn có thể tìm thấy trên các phím ngoài sqlite doc.

+5

Giải pháp này không hiệu quả đối với tôi. Các giải pháp tôi tìm thấy là để xác định tất cả trong một dòng nhưng với một cú pháp hơi khác nhau. Tôi đã làm điều này thay vì 2 dòng cuối cùng: TASK_CAT + "TÀI LIỆU THAM KHẢO" + CAT_TABLE + ");"; – HotN

+0

@HotN, bạn là bạn thân. Giải pháp của bạn cũng làm việc cho tôi. Cảm ơn – blueware

+0

@ jetho Tôi muốn thêm chức năng mà một khi khóa chính đã xóa tất cả các bản ghi cột của con bạn cũng sẽ bị xóa. – UnKnown

1

Như bạn có thể thấy trong mô tả lỗi, bảng của bạn chứa các cột (_id, tast_title, notes, reminder_date_time) và bạn đang cố gắng thêm khóa ngoại từ cột "taskCat" nhưng nó không tồn tại trong bảng của bạn!

9

Vì tôi không thể nhận xét, thêm ghi chú này ngoài câu trả lời @jethro.

Tôi phát hiện ra rằng bạn cũng cần phải thực hiện dòng KEY NGOÀI như là phần cuối cùng của việc tạo bảng sao kê, nếu không bạn sẽ gặp lỗi cú pháp khi cài đặt ứng dụng của mình. Ý tôi là, bạn không thể làm điều gì đó như thế này:

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);"; 

Tôi đặt TASK_DATE_TIME sau dòng khóa ngoài.

Các vấn đề liên quan