android - relations - sqlite fk example
SQLite Delete Cascade no funciona (4)
Intenta agregar esto justo después de abrir la base de datos en tu aplicación de Android:
db.execSQL("PRAGMA foreign_keys=ON");
Esto activa la compatibilidad con claves externas, lo que es necesario para que ON DELETE CASCADE
funcione correctamente.
En Android 4.2, utilizando SQLite 3.7.11, cuando elimino una fila de la tabla de cuestionarios, cuyo esquema está debajo, las filas correspondientes en la tabla QuizQuestions no se eliminan.
No puedo entender lo que está mal. He intentado poner
db.execSQL("PRAGMA foreign_keys = ON;");
antes y después de las instrucciones create table.
Crear declaraciones de tabla:
CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE);
CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER,
PRIMARY KEY(quiz_name, question_id),
FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE,
FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE);
Sqlite deshabilita la restricción de clave externa de forma predeterminada, por lo que debe habilitarla simplemente anula el método Open en su clase DBhelper como se muestra a continuación
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
Su base de datos debe eliminar filas de quizQuestions
en caso de que alguien esté eliminando quizzes
o questions
. Ignorará toda la restricción de clave externa en caso de que la compatibilidad de clave externa esté desactivada y usted solo tenga columnas regulares que puedan contener cualquier valor.
SQLite se predetermina a PRAGMA foreign_keys = OFF
cada vez que abre la base de datos. No es una propiedad de una tabla o del esquema.
En caso de que use SQLiteOpenHelper
, onOpen
en onOpen
. Ese es el lugar que se llama cada vez que se abre la base de datos. onCreate
solo una vez cuando se crea la base de datos.
Lo que SQLiteOpenHelper
llama cuando llama a getWriteableDatabase
por primera vez es
-
onConfigure
cada vez, se requiere Nivel de API> = 16 - dependiendo de la existencia y la versión del archivo de base de datos, se llama a lo siguiente dentro de una transacción
-
onCreate
si no hay un archivo de base de datos. Por lo general, esto ocurre una sola vez durante toda la vida de la aplicación. -
onUpgrade
si la versión de la base de datos (PRAGMA user_version
- guardada dentro del archivo de base de datos) es menor que la versión proporcionada en el constructor de SQLiteOpenHelper. Ocurre cada vez que topas la versión en tu código. - Nada si el archivo existe y la versión coincide.
-
-
onOpen
todo el tiempo
Si la misma instancia de SQLiteOpenHelper
ya tiene una base de datos abierta, simplemente la devolverá y no ocurrirá nada de lo anterior.
tuve el mismo problema en Visual Basic !!! tienes que escribir el texto de comando de esta manera:
cone.CommandText = "PRAGMA foreign_keys = ON; ELIMINAR DE los empleados WHERE cod_emp = 0;"
y tienes que hacerlo cada vez que eliminas algo