update relations references foreign foranea example delete constraint clave android sqlite cascading-deletes

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

  1. onConfigure cada vez, se requiere Nivel de API> = 16
  2. 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.
  3. 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