Tengo dos tablas: tracks y waypoints, un track puede tener muchos waypoints, pero un waypoint se asigna a solo 1 track.
En la tabla de puntos de ruta, tengo una columna llamada "trackidfk" que inserta el track_ID una vez que se crea una pista, sin embargo, no he configurado las restricciones de clave externa en esta columna.
Cuando borro un track quiero borrar los waypoints asignados, ¿es posible ?. Leí sobre el uso de Triggers, pero no creo que sean compatibles con Android.
Para crear la tabla de waypoints:
public void onCreate(SQLiteDatabase db) {
db.execSQL( "CREATE TABLE " + TABLE_NAME
+ " ("
+ _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ LONGITUDE + " INTEGER,"
+ LATITUDE + " INTEGER,"
+ TIME + " INTEGER,"
+ TRACK_ID_FK + " INTEGER"
+ " );"
);
...
}
java
android
sqlite
foreign-keys
jcrowson
fuente
fuente
PRAGMA
declaraciones,onConfigure()
pero requiere API nivel 16 (Android 4.1), y para entonces simplemente puede llamarsetForeignKeyConstraintsEnabled
.onCreate
/onDowngrade
/onUpgrade
, que son anterioresonOpen
. Consulte el código fuente en Android 4.1.1 .Desde Android 4.1 (API 16), SQLiteDatabase admite:
fuente
Como dice la publicación de e.shishkin de API 16 en adelante, debe habilitar las restricciones de clave externa en el
SqLiteOpenHelper.onConfigure(SqLiteDatabase)
método utilizando eldb.setForeignKeyConstraintsEnabled(boolean)
fuente
Nunca una pregunta demasiado vieja para responder con una respuesta más completa.
fuente
Lo que sea que @phil mencione es bueno. Pero puede usar otro método predeterminado disponible en la base de datos para configurar la clave externa. Eso es setForeignKeyConstraintsEnabled (verdadero).
Para documentos, consulte SQLiteDatabase.setForeignKeyConstraintsEnabled
fuente
A good time to call this method is right after calling openOrCreateDatabase(File, SQLiteDatabase.CursorFactory) or in the onConfigure(SQLiteDatabase) callback.
Entonces, en lugar deonOpen
,onConfigure
parece ser el lugar correcto.No creo que SQLite admita esto de inmediato. Lo que estoy haciendo en mis aplicaciones es:
De esa manera, estoy seguro de que se eliminan todos los datos o ninguno.
fuente
Los activadores son compatibles con Android y ese tipo de eliminación en cascada no es compatible con sqlite. Aquí puede encontrar un ejemplo del uso de activadores en Android . Aunque usar transacciones como dijo Thorsten es probablemente tan fácil como un disparador.
fuente
La versión de SQLite en Android 1.6 es 3.5.9, por lo que no admite claves externas ...
http://www.sqlite.org/foreignkeys.html "Este documento describe la compatibilidad con las restricciones de clave externa de SQL introducidas en la versión 3.6.19 de SQLite".
En Froyo es SQLite versión 3.6.22, así que ...
EDITAR: para ver la versión de sqlite: adb shell sqlite3 -version
fuente
Las claves externas con "en cascada de eliminación" son compatibles con SQLite en Android 2.2 y versiones posteriores. Pero tenga cuidado al usarlos: a veces se informa un error al activar una clave externa en una columna, pero el problema real radica en otra restricción de clave externa de columna en la tabla secundaria, o en alguna otra tabla que hace referencia a esta tabla.
Parece que SQLite comprueba todas las restricciones al activar una de ellas. De hecho, se menciona en la documentación. Verificaciones de restricciones DDL versus DML.
fuente
Si está utilizando Android Room, haga lo que se muestra a continuación.
fuente