web-dev-qa-db-fra.com

SQlite - Android - Syntaxe de clé étrangère

J'ai essayé de faire fonctionner des clés étrangères dans ma base de données Android SQLite. J'ai essayé la syntaxe suivante mais cela me donne une force proche:

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

Des idées sur ce que je pourrais faire de mal? si vous avez besoin de voir l'autre structure de table, je peux, c'est juste une structure très simple pour la seconde avec un ID et un nom.

Modifier:

Voici l'erreur:

13/03 13: 42: 35.389: ERREUR/AndroidRuntime (312): Causé par: Android.database.sqlite.SQLiteException: colonne inconnue "taskCat" dans la définition de clé étrangère: créez des rappels de table (_id entier entier auto-incrémentation de la clé primaire, texte de la fonction_title non null, texte des notes non null, texte reminder_date_time non nul, FOREIGN KEY (taskCat) REFERENCES category (_id));

50
user319940

Vous devez définir votre TASK_CAT d'abord la colonne, puis définissez la clé étrangère dessus.

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

Plus d'informations que vous pouvez trouver sur les clés étrangères sqlite doc .

104
jethro

Comme je ne peux pas commenter, ajouter cette note en plus de la réponse @jethro.

J'ai découvert que vous devez également faire la ligne FOREIGN KEY comme dernière partie de la création de l'instruction table, sinon vous obtiendrez une erreur de syntaxe lors de l'installation de votre application. Ce que je veux dire, c'est que vous ne pouvez pas faire quelque chose comme ça:

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

Où j'ai mis le TASK_DATE_TIME après la ligne de clé étrangère.

10
nommer

Comme vous pouvez le voir dans la description de l'erreur, votre table contient les colonnes (_id, tast_title, notes, reminder_date_time) et vous essayez d'ajouter une clé étrangère à partir d'une colonne "taskCat" mais elle n'existe pas dans votre table!

2
aweis