2011-03-13 10 views
48

He estado tratando de obtener claves externas trabajando en mi base de datos SQLite de Android. He intentado el siguiente sintaxis pero me da una fuerza de cierre:SQlite - Android - Sintaxis de clave externa

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

Alguna idea de lo que podría estar haciendo mal? si necesita ver la otra estructura de tabla, entonces puedo, es solo una estructura muy simple para el segundo con una ID y un nombre.

Editar:

Aquí está el error:

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

Respuesta

99

Usted tiene que definir su columna TASK_CAT establecer primero y luego clave externa en él.

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

Más información se puede encontrar en las claves externas sqlite doc.

+5

Esta solución no funcionó para mí. La solución que encontré fue definirlo todo en una línea, pero con una sintaxis ligeramente diferente. Hice esto en lugar de las 2 últimas líneas: TASK_CAT + "INTEGER REFERENCES" + CAT_TABLE + ");"; – HotN

+0

@HotN, tienes razón amigo. Tu solución funcionó para mí también. Gracias – blueware

+0

@jetho Quiero agregar functionallity que una vez que la clave principal eliminó todos los registros de la columna del niño también deben eliminarse. – UnKnown

1

Como puede ver en la descripción del error, su tabla contiene las columnas (_id, tast_title, notes, reminder_date_time) e intenta agregar una clave foránea desde la columna "taskCat" pero no existe en su tabla.

9

Como no puedo hacer ningún comentario, agrego esta nota además de @jethro answer.

Descubrí que también necesita hacer la línea FOREIGN KEY como la última parte de crear la declaración de la tabla, de lo contrario obtendrá un error de sintaxis al instalar su aplicación. Lo que quiero decir es, no se puede hacer algo como esto:

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

Dónde pongo la TASK_DATE_TIME después de la línea de clave externa.