SQLite удалить Каскад не работает
В Android 4.2, используя SQLite 3.7.11, когда я удаляю строку из таблицы Викторин, схема которого находится ниже, соответствующие строки в таблице Викторин не удаляются.
Я не могу понять, что случилось. Я пробовал положить
db.execSQL("PRAGMA foreign_keys = ON;");
до и после операторов create table.
Create TABLE операторы:
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 ответов
ваша база данных должна удалить строки quizQuestions
в случае если кто-то удаляет из quizzes
или questions
. Он будет игнорировать весь ограничение внешнего ключа в случае, если поддержка внешнего ключа отключена, и у вас есть только обычные столбцы, которые могут содержать любое значение.
SQLite по умолчанию PRAGMA foreign_keys = OFF
каждый раз, когда вы открыть базы данных. Это не свойство таблицы или схемы.
в случае, если вы используете SQLiteOpenHelper
положите его в onOpen
. Это место, которое вызывается каждый раз при открытии базы данных. onCreate
только один раз при создании базы данных.
что SQLiteOpenHelper
звонки, когда вы звоните getWriteableDatabase
в первый раз
-
onConfigure
каждый раз, уровень API >= 16 требуется - в зависимости от наличия и версии файла базы данных в транзакции вызывается следующее
-
onCreate
если нет файла базы данных. Как правило, это происходит только один раз за всю жизнь приложения. -
onUpgrade
если версия базы данных (PRAGMA user_version
- сохранено в файле базы данных) меньше, чем версия, предоставленная в конструкторе SQLiteOpenHelper. Происходит каждый раз, когда вы сталкиваетесь с версией в коде. - ничего, если файл существует и версия совпадает.
-
-
onOpen
каждый раз
если тот же экземпляр SQLiteOpenHelper
уже есть открытая база данных, она будет просто верните его, и ничего из вышеперечисленного не произойдет.
попробуйте добавить это сразу после открытия базы данных в приложение для Android:
db.execSQL("PRAGMA foreign_keys=ON");
Это включает поддержку внешних ключей, которая необходима для ON DELETE CASCADE
для правильной работы.
Sqlite отключить ограничение внешнего ключа по умолчанию, поэтому вам нужно включить его по просто переопределите метод onOpen в вашем классе DBhelper, как показано ниже
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
У меня была такая же проблема на visual basic!!! вы должны написать текст команды следующим образом:
конусная.CommandText = " PRAGMA foreign_keys = ON; удалить из сотрудников Где cod_emp=0;"
и вы должны делать это каждый раз, когда вы удаляете что-то