Я разрабатываю приложение Android 2.2+ с поддержкой SQLite db. Я пытаюсь определить ограничения ссылочной целостности при создании таблиц. Я также включил поддержку внешнего ключа, выполнив db.execSQL("PRAGMA foreign_keys=ON;");
в onCreate
и onOpen
методах SQLiteOpenHelper
. Afteer, настраивая мои таблицы и соответствующие ссылки на внешние ключи, по-прежнему позволяет мне insert
строк в таблицах, где отсутствуют контрольные записи. Напр. Я следующая структуруAndroid 2.2 + SQLite + Определение ограничений ссылочной целостности
CREATE TABLE Questions(_id integer primary key,question text not null);
CREATE TABLE Ques_Ans(_id integer primary key autoincrement,qid integer not null,
aid integer not null,is_correct integer default 0,
FOREIGN KEY (qid) REFERENCES Questions(_id));
и после моих данных в таблице
INSERT INTO Questions VALUES(1, 'Some text');
INSERT INTO Ques_Ans(qid, aid, is_correct) VALUES(20, 1, 0);
Если внешний ключ правильно установлен на столе Ques_Ans, вторая вставка должна провалилась, поскольку нет никаких записей в Questions
таблицы с id 20
, но почему-то мое приложение не выбрасывает какую-либо ошибку и вставляет второй оператор insert. Может кто-нибудь сказать мне, что здесь не так, или я не вижу никакой конфигурации здесь?
Update [03-Mar-2012]: После обсуждения нити с @Catcall
- Использование
sqlite3
инструмента, переключение наPRAGMA foreign_keys=ON;
иностранных ключевых работ, как ожидается - То же самое, если использовать через приложение на эмуляторе или на Телефон не работает
- Вставьте операторы, выполненные с использованием
insert()
илиexecSQL()
. Ни один из них не выбрасываетforeign key constraint failed
error PRAGMA integrity_check
ok
. Таким образом, база данных не повреждена.
+1 только для того, чтобы включить весь SQL, который может возникнуть, чтобы воспроизвести проблему. –
просто примечание для будущих читателей. То же самое существует и с 2015 года. –