Подтвердить что ты не робот

SQLite Delete Cascade не работает

В Android 4.2, используя SQLite 3.7.11, когда я удаляю строку из таблицы Quizzes, какая схема ниже, соответствующие строки в таблице QuizQuestions не удаляются.

Я не могу понять, что случилось. Я попытался поставить

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

до и после операторов таблицы создания.

Создание операторов таблицы:

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);
4b9b3361

Ответ 1

Ваша база данных должна удалять строки из quizQuestions, если кто-то удаляет из quizzes или из questions. Он будет игнорировать все ограничения внешнего ключа, если поддержка внешнего ключа отключена, и у вас есть только обычные столбцы, которые могут содержать любое значение.

SQLite по умолчанию PRAGMA foreign_keys = OFF при каждом открытии базы данных. Это не свойство таблицы или схемы.

Если вы используете SQLiteOpenHelper, поместите его в onOpen. Это место, которое вызывается каждый раз при открытии базы данных. onCreate только один раз при создании базы данных.


Что вызывает SQLiteOpenHelper, когда вы вызываете getWriteableDatabase в первый раз, это

  • onConfigure каждый раз, требуется уровень API >= 16
  • в зависимости от наличия и версии файла базы данных в транзакции вызывается следующее:
    • onCreate, если файл базы данных отсутствует. Как правило, это происходит только один раз за всю жизнь приложения.
    • onUpgrade, если версия базы данных (PRAGMA user_version - сохранена внутри файла базы данных) меньше версии, указанной в конструкторе SQLiteOpenHelper. Случается каждый раз, когда вы используете версию в своем коде.
    • Ничего, если файл существует и версия соответствует.
  • onOpen каждый раз

Если тот же экземпляр SQLiteOpenHelper уже имеет открытую базу данных, он просто вернет его, и ничего из этого не произойдет.

Ответ 2

Попробуйте добавить это сразу после открытия базы данных в своем приложении для Android:

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

Это включает поддержку внешних ключей, что необходимо для правильной работы ON DELETE CASCADE.

Ответ 3

Sqlite отключает ограничение внешнего ключа по умолчанию, поэтому вам нужно включить его с помощью просто переопределить метод onOpen в вашем классе DBhelper, как показано ниже

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

Ответ 4

У меня была такая же проблема на визуальной основе!!! вы должны написать текст команды следующим образом:

cone.CommandText = "PRAGMA foreign_keys = ON; УДАЛИТЬ ОТ сотрудников WHERE cod_emp = 0;"

и вы должны делать это каждый раз, когда вы что-то удаляете