2012-05-23 10 views
13

tengo "día" tabla creada de la siguiente manerarestricción de clave externa en Eliminar CASCADE que no trabajan en la base de datos SQLite en android

"create table days(" + 
      "day_id integer primary key autoincrement, " + 
      "conference_id integer , " + 
      "day_date text, " + 
      "day_start_time text, " + 
      "day_end_time text, " + 
      "day_summary text, " + 
      "day_description text)"; 

y tengo pistas de mesa creados de la siguiente manera

CREATE_TABLE_TRACK = "create table track(" + 
     "track_id integer primary key autoincrement," + 
     "day_id integer,"+ 
     "track_name text," + 
     "track_description text," + 
     " FOREIGN KEY(day_id) REFERENCES days(day_id) ON DELETE CASCADE)"; 

como se muestra arriba tengo la clave foránea day_id haciendo referencia al day_id de los días de la tabla ...

Así que lo que quiero es que si elimino el día, la pista correspondiente también se elimine ... Pero en mi caso no sucede ...

tengo sqlite con la versión 3.5.9

y también he añadido la línea 1 en mi clase de ayuda como

> db.execSQL ("FOREIGN_KEYS PRAGMA = ON;");

pero sigue siendo no va a funcionar .. por favor me ayude ..

+0

pero como he dicho, he agregado la línea "PRAGMA foreign_keys = ON;" en mi clase de ayuda sqlite – NullPointerException

Respuesta

9

La eliminación en cascada no se admite hasta la versión 3.6.19 de Sqlite, que se incluye por primera vez en Android 2.2.

Afortunadamente hay una alternativa.

Puede ejecutar otra consulta como esta por debajo de su creación consulta de tabla:

db.execSQL("CREATE TRIGGER delete_days_with track BEFORE DELETE ON track " 
     + "FOR EACH ROW BEGIN" 
     +   " DELETE FROM days WHERE track.day_id = days.day_id " 
     + "END;"); 

Tenga en cuenta que delete_days_with_track es sólo un nombre descriptivo de lo que hace el gatillo, y esto es sólo el patrón de uso; Creo que podrías nombrar cualquier cosa que desees.

+4

Esto no funciona para mí. Tengo que usar (WHERE OLD.day_id = days.day_id) para que funcione. Pasé mucho tiempo hasta que lo lancé. Para más información. http://www.sqlite.org/cvstrac/wiki?p=ForeignKeyTriggers –

+0

Gracioso. Tengo 3.7.9 aquí en una máquina Ubuntu 12.04 y ON DELETE CASCADE tampoco funciona. Extrañamente, tampoco lo hace el disparador: traducido al ejemplo dado, afirma "Error: no dicha columna: track.day_id" - aunque un 'SELECT * FROM track ÚNETE días EN track.day_id = days.day_id' funciona bien. Estoy confundido. – Izzy

1

De acuerdo con el apoyo SQLite Documentation de claves externas no se añadió hasta 3.6.19.

Usando 3.5.9 tendrá que hacer las eliminaciones en cascada de alguna otra manera.

+0

¿Hay alguna manera de actualizar la versión de sqlite o de otra forma? porque tengo que admitir mi aplicación en la versión de Android 2.1 en adelante – NullPointerException

+0

No tiene que hacer eliminaciones manualmente, consulte la consulta de activación a continuación. – jkschneider

+0

@jkschneider, ¡Ah, gracias! Yo uso SQLite, pero no pretendo ser un experto. Gracias por enseñarme algo nuevo. – Barak

Cuestiones relacionadas