sqlite ограничение не удалось код ошибки - PullRequest
4 голосов
/ 30 июля 2010

У меня есть две таблицы альбомов и песен, и каждая песня имеет ссылку на идентификатор квасца.

Таблица альбомов:

CREATE TABLE albums
(id INTEGER PRIMARY KEY ASC,
name TEXT,
additional TEXT)

Таблица песен:

CREATE TABLE songs
(id INTEGER PRIMARY KEY ASC,
album_fk INTEGER NOT NULL,
title TEXT,
url TEXT,
duration BIGINT NOT NULL)

и у меня также есть триггер для проверки, когда я удаляю альбом, если в нем есть существующие песни:

CREATE TRIGGER trigger_on_delete
BEFORE DELETE ON albums
FOR EACH ROW BEGIN
SELECT RAISE(FAIL,'album has songs cannot be deleted')
WHERE (SELECT album_fk FROM songs WHERE album_fk = OLD.id) IS NOT
NULL;)
END

все это работает нормально, но иногда

Exception: android.database.sqlite.SQLiteConstraintException: error
code 19: constraint failed
Stack Trace :
android.database.sqlite.SQLiteStatement.native_execute(Native Method)
android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:
66)

выбрасывается при попытке удалить альбом. Мой метод удаления - это просто удаление альбома по id. Плохо то, что я не могу воспроизвести это, поэтому я не могу предоставить много информации. Я пробовал разные сценарии удаления альбома, но у меня никогда не было этого исключения.

Так что любые идеи, как можно исследовать эту проблему. В таблице альбомов нет никаких ограничений, так что может вызвать такое исключение? Любая помощь будет оценена.

Ответы [ 4 ]

2 голосов
/ 30 января 2012

Я решил эту проблему, исправив определение моей базы данных в поле НЕ НЕДЕЙСТВИТЕЛЬНОЕ.Вы должны отправить некоторые данные.

2 голосов
/ 30 июля 2010

Это так нечестно.Если вы запускаете этот код на ПК, все в порядке, и если вы пытаетесь удалить альбом с песнями, исключение говорит: альбом с песнями не может быть удален ", но кажется, что парни с Android не обрабатывают правильный RAISE из sqlite и jsut throw Exception:android.database.sqlite.SQLiteConstraintException: код ошибки 19: ограничение не выполнено.

1 голос
/ 24 июня 2011

У меня была такая же проблема с некоторыми триггерами в фоновом режиме, я наконец переключился на эту классическую опцию, и она исправила мою проблему:

db.rawQuery ("столбец набора таблиц UPDATE = newValue WHERE ...;", ноль);

0 голосов
/ 12 апреля 2011

См. Также «SQLiteStatement не распространяет сообщения об ошибках, определенные в триггерах SQLite» http://code.google.com/p/android/issues/detail?id=3296

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