Android 2.2 + SQLite + Определение ограничений ссылочной целостности - PullRequest
2 голосов
/ 01 марта 2012

Я занимаюсь разработкой приложения для Android 2.2+ с поддержкой SQLite db. Я пытаюсь определить ограничения ссылочной целостности при создании таблиц. Я также включил поддержку внешнего ключа, выполнив db.execSQL( "PRAGMA foreign_keys=ON;" ); в onCreate и onOpen методах SQLiteOpenHelper. После настройки моих таблиц и правильных ссылок на внешний ключ он все еще позволяет мне insert строк в таблицах, где отсутствуют ссылочные записи. Например, У меня следующая структура

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, 2-я вставка должна была завершиться неудачно, так как в таблице Questions нет записи с идентификатором 20, но каким-то образом мое приложение не выдает никакой ошибки и вставляет 2-й оператор вставки. Кто-нибудь может сказать мне, что здесь не так, или мне здесь не хватает конфигурации?

Обновление [03 марта 2012]: после обсуждения с @ Catcall

  • Использование инструмента sqlite3, включение PRAGMA foreign_keys=ON; внешнего ключа работает как положено
  • То же самое, если используется через приложение на эмуляторе или на телефоне не работает
  • Вставить операторы, выполненные с использованием insert() или execSQL(). Никто из них не выбрасывает foreign key constraint failed ошибка
  • PRAGMA integrity_check возвращает ok. Таким образом, база данных не повреждена.

Ответы [ 2 ]

1 голос
/ 01 марта 2012

Ваш внешний ключ находится в столбце "qid", а не в столбце "_id".

Этот оператор INSERT

INSERT INTO Ques_Ans VALUES(20, 1, 0);

должен выброситьошибка

Error: table Ques_Ans has 4 columns but 3 values were supplied

Эта вставка должна быть успешной.

INSERT INTO Ques_Ans VALUES(20, 1, 0, 0);

Эта ошибка должна быть неудачной.

INSERT INTO Ques_Ans VALUES(21, 2, 0, 0);
Error: foreign key constraint failed

Позже.,.

Поскольку он работает в sqlite, но не в вашем эмуляторе, возможно, проблема в эмуляторе или в вашем коде.

Это идиома для транзакций базы данных.

 db.beginTransaction();
   try {
     ...
     db.setTransactionSuccessful();
   } finally {
     db.endTransaction();
   }

Документы по Android предлагают использовать insert () вместо execSQL () .Убедитесь, что вы перехватываете, ловите или проверяете наличие ошибок в каждой функции, которая может возвращать ошибку.Так, например, если вы переключитесь на insert (), проверьте его возвращаемое значение для -1.

Если это не поможет, вы можете попробовать пометить этот вопрос с помощью «Java» (например), илизадавать новый вопрос, который фокусируется на вашем коде и на обнаружении ошибок.

0 голосов
/ 07 января 2015

IN SQLite Ограничения внешнего ключа по умолчанию отключены (для обратной совместимости).Вы должны включить его явно, используя

PRAGMA foreign_keys = 1 после установления соединения с базой данных.Вот ссылка на официальные документы, которые объясняют это более подробно.http://sqlite.org/foreignkeys.html Перейдите к включению поддержки внешнего ключа в приведенной выше ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...