SQLite Eliminar Cascade no funciona

En Android 4.2, al usar SQLite 3.7.11, cuando elimino una fila de la tabla de Quizzes, el esquema de quién está debajo, las filas correspondientes en la tabla QuizQuestions no se eliminarán.

No puedo entender lo que está mal. He intentado poner

db.execSQL("PRAGMA foreign_keys = ON;"); 

Antes y después de las sentencias create table.

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

4 Solutions collect form web for “SQLite Eliminar Cascade no funciona”

Su base de datos debe eliminar las filas de quizQuestions en caso de que alguien esté eliminando de quizzes o de questions . Ignorará toda la restricción de clave externa en caso de que el soporte de clave externa esté desactivado y tenga sólo columnas regulares que pueden contener cualquier valor.

SQLite PRAGMA foreign_keys = OFF a PRAGMA foreign_keys = OFF cada vez que abra la base de datos. No es una propiedad de una tabla o del esquema.

En caso de que use SQLiteOpenHelper ponerlo en onOpen . Ese es el lugar que se llama cada vez que se abre la base de datos. onCreate sólo 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 el nivel API> = 16
  2. Dependiendo de la existencia y la versión del archivo de la base de datos, se invoca lo siguiente en una transacción
    • onCreate si no hay ningún archivo de base de datos. Normalmente, esto ocurre sólo una vez en toda la vida de la aplicación.
    • onUpgrade si la versión de base de datos ( PRAGMA user_version – guardada dentro del archivo de base de datos) es menor que la versión suministrada en el constructor de SQLiteOpenHelper. Sucede cada vez que golpea la versión en su código.
    • Nada si el archivo existe y la versión coincide.
  3. onOpen toda hora

Si la misma instancia de SQLiteOpenHelper ya tiene una base de datos abierta, simplemente la devolverá y no sucederá nada de lo anterior.

Intenta agregar este derecho después de abrir la base de datos en tu aplicación de Android:

 db.execSQL("PRAGMA foreign_keys=ON"); 

Esto activa el soporte para claves foráneas, que es necesario para que ON DELETE CASCADE funcione correctamente.

Sqlite deshabilitar restricción de clave externa de forma predeterminada, por lo que es necesario habilitarlo simplemente anular el método onOpen en su clase DBhelper como a continuación

 public class YourOwnDbHelper extends SQLiteOpenHelper { @Override public void onOpen(SQLiteDatabase db){ super.onOpen(db); db.execSQL("PRAGMA foreign_keys=ON"); } } 

Tuve el mismo problema visual básico! Usted tiene que escribir el texto del comando como esto:

Cone.CommandText = "PRAGMA foreign_keys = ON; BORRAR DE los empleados WHERE cod_emp = 0;"

Y tienes que hacerlo cada vez que elimines algo

  • Utilización de la base de datos legible y escrita de SQLite
  • Alcanzó el tamaño MAX para la caché de instrucciones compiladas-sql para la base de datos
  • Intento de reabrir un objeto sqlitedatabase ya cerrado
  • Problema de orden de consultas SQLite de Android
  • ¿Cómo puede obtener la parte superior de los registros de GreenDAO?
  • Uso de la palabra clave IN en android sqlite
  • Android + Robolectric - RuntimeException / InstantiationException en queryBuilder.query () en ContentProvider
  • Cómo personalizar FTS tokenizer en Android
  • Consulta SQL para la relación de los hijos progenitores
  • ¿El cursor SQLite de Android carga todos los registros en la memoria a la vez?
  • Java.sql.SQLException: No se puede ejecutar insert stmt en objeto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.