2011-03-13 10 views
48

Próbowałem uzyskać klucze obce działające w bazie danych Android SQLite. Próbowałem następującej składni, ale daje mi to siłę blisko:SQlite - Android - Składnia klucza obcego

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

Jakieś pomysły, co mogę robić źle? jeśli potrzebujesz zobaczyć inną strukturę tabeli, to mogę, to jest bardzo prosta struktura dla drugiej z identyfikatorem i nazwą.

Edit:

Tutaj jest błąd:

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

Odpowiedz

99

Musisz zdefiniować kolumnę TASK_CAT pierwszy, a następnie ustawić klucz obcy na nim.

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

Więcej informacji można znaleźć na klucze obce sqlite doc.

+5

To rozwiązanie nie działa dla mnie. Rozwiązaniem, które znalazłem, było zdefiniowanie wszystkiego w jednym wierszu, ale z nieco inną składnią. Zrobiłem to zamiast dwóch ostatnich linii: TASK_CAT + "INTEGER REFERENCES" + CAT_TABLE + ");"; – HotN

+0

@HotN, masz rację kolego. Twoje rozwiązanie również zadziałało. Dzięki – blueware

+0

@jetho Chcę dodać functionallity, że po usunięciu klucza nadrzędnego cały rekord dziecka powinien zostać usunięty. – UnKnown

1

Jak widać w opisie błędu twoja tabela zawiera kolumny (_id, tast_title, notes, reminder_date_time) i próbujesz dodać klucz obcy z kolumny "taskCat", ale nie istnieje w twoim stole!

9

Ponieważ nie mogę komentować, dodając tę ​​notatkę oprócz odpowiedzi @jethro.

Dowiedziałem się, że należy również wykonać linię klucza OBCEGO jako ostatnią część tworzenia instrukcji tabeli, w przeciwnym razie pojawi się błąd składniowy podczas instalowania aplikacji. Co mam na myśli to, że nie może zrobić coś takiego:

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

Gdzie umieścić TASK_DATE_TIME po linii klucza obcego.

Powiązane problemy