2010-07-30 8 views
4

두 개의 테이블 앨범과 노래가 있으며 각 노래에는 명반의 ID가 들어 있습니다.sqlite 제약 조건 오류 코드

앨범 테이블 :

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 
: 나는 또한 기존 노래가있는 경우 내가 앨범을 삭제할 때 확인하는 트리거가

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

과 :

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

노래 테이블

이 모든 것이 정상적으로 작동하지만 때로는

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로 앨범을 삭제하는 것입니다. 나쁜 일은 내가 재생할 수 없기 때문에 제공 할 수있는 정보가 없습니다. 앨범을 삭제하는 것과 다른 시나리오를 시도했지만이 예외가 전혀 없었습니다.

그래서 어떤 아이디어가이 문제를 조사 할 수 있습니다. 앨범 테이블에는 아무런 제약이 없으므로 그러한 예외가 발생할 수 있습니까? 어떤 도움을 주시면 감사하겠습니다.

+0

우선 SQLite 데이터베이스 브라우저를 다운로드하는 것이 좋습니다. 이 소프트웨어는 에뮬레이터에서 쿼리를 내 보낸 후 쿼리를 테스트 할 수있는 기능을 제공합니다. 이렇게하면 오류가 있는지 확인할 수 있습니다. 게다가, 함수를 생성 한 직후에, 당신은; 하지만 그것은 당신이 당신의 테이블에 처음으로 만들었을 때 – Sephy

+0

당신의 게시물에있는 그대로 제약이 없었나요? 제약 조건을 가지고 처음으로 실행하면 테이블이 생성됩니다. 그런 다음 제약 조건을 제거하고 프로젝트를 다시 실행하면 테이블이 다시 작성되지 않습니다 (getWrtiableDatabase() 만 사용하는 경우). 이전 버전 (제약 조건 포함)을 갖게됩니다. 따라서 먼저 삭제해야합니다. – ccheneson

답변

2

이것은 너무 공평하지 않습니다. PC에서이 코드를 실행하면 모든 것이 정상이며 노래가있는 앨범을 삭제하려고하면 앨범에 노래를 삭제할 수 없습니다.하지만 안드로이드 녀석이 sqlite 및 jsut에서 올바른 RAISE를 처리하지 못하는 것 같습니다 예외 : android.database.sqlite.SQLiteConstraintException : 오류 코드 19 :. 제약 조건이 실패

1

은 내가 backgroung에 약간의 트리거와 같은 문제가 있었다 "SQLiteStatement SQLite는 정의 오류 메시지를 전파되지 않습니다 트리거" 마지막으로이 클래식 옵션으로 전환하여 문제가 해결되었습니다.

db.rawQuery ("UPDATE 테이블 설정 열 = newValue WHERE ...; ", null);

2

내 데이터베이스의 정의를 NOT NULL 필드로 수정하여이 문제를 해결했습니다. 데이터를 보내야합니다.