web-dev-qa-db-de.com

SQlite - Android - Fremdschlüsselsyntax

Ich habe versucht, Fremdschlüssel in meine SQLite-Datenbank Android zu integrieren. Ich habe die folgende Syntax ausprobiert, aber es gibt mir eine Kraft nahe:

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

Irgendwelche Ideen, was ich falsch machen könnte? Wenn Sie die andere Tabellenstruktur sehen müssen, kann ich, es ist nur eine sehr einfache Struktur für die Sekunde mit einer ID und einem Namen.

Bearbeiten:

Hier ist der Fehler:

03-13 13: 42: 35.389: ERROR/AndroidRuntime (312): Verursacht durch: Android.database.sqlite.SQLiteException: unbekannte Spalte "taskCat" in Fremdschlüsseldefinition: Tabellenerinnerungen erstellen (_id Ganzzahl-Primärschlüssel-Autoincrement, task_title-Text nicht) null, notentext nicht null, reminder_date_time text nicht null, FOREIGN KEY (taskCat) REFERENCES category (_id));

50
user319940

Sie müssen zuerst die Spalte TASK_CAT Definieren und dann den Fremdschlüssel darauf setzen.

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

Weitere Informationen finden Sie unter sqlite-Fremdschlüssel doc .

104
jethro

Da ich keinen Kommentar abgeben kann, füge ich diesen Hinweis zusätzlich zu @jethro hinzu.

Ich habe herausgefunden, dass Sie auch die FOREIGN KEY-Zeile als letzten Teil der Tabellenanweisung erstellen müssen, da sonst bei der Installation Ihrer App ein Syntaxfehler auftritt. Ich meine, Sie können so etwas nicht machen:

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

Wo ich das TASK_DATE_TIME nach der Fremdschlüsselzeile setze.

10
nommer

Wie Sie in der Fehlerbeschreibung sehen können, enthält Ihre Tabelle die Spalten (_id, tast_title, notes, reminder_date_time) und Sie versuchen, einen Fremdschlüssel aus einer Spalte "taskCat" hinzuzufügen, der jedoch in Ihrer Tabelle nicht vorhanden ist!

2
aweis