2014-02-18 2 views
0

내 응용 프로그램은 복잡한 SQL 문을 사용하므로 자주 execsql을 자주 사용하는 습관을 겪었습니다. 심지어 간단한 것 (아래)에 대한 삽입 또는 업데이트와 같은 것을 사용해야 할 수도 있습니다. . 이것이 내가 분명히 실패 할 경우 데이터를이 시도했습니다안드로이드 Sqlite SQLiteAbortException 작동하지 않습니다

String query = "UPDATE OR ABORT " + myTable + " SET " + .... column names and values + WHERE ... 
try { 
    db.execSQL(query); 
} catch (SQLiteAbortException e) { 
    Log.i(TAG, "error in the update"); 

를 작동하지 않는 이유

그러나, 나는 궁금 오전 (즉, 일치하는 기록을 갱신 아니된다) 그러나 나는 캐치를 타격하고 있지 않다 . 처음에 나는 UPDATE 또는 FAIL과 SQLiteConstraintException을 사용했다하지만 적발되지 않았을 때 내가 특별히

SQLite는 프로그램이 중단 한 것을 나타내는 예외를 내용의 SQLiteAbortException을 시도했다. 이 은 트리거에서 ABORT를 호출하거나 ABORT 충돌 절을 사용하여 결과로 발생할 수 있습니다.

무엇이 여기에 있습니까?

업데이트 : INSERT/UPDATE 또는 ABORT/FAIL에서 참조 용으로 this을 추가하는 것입니다. SQLiteAbortException이 방법이 아니라면 어떻게 업데이트를 중단하거나 실패 할 수 있습니까?

+1

'ABORT'는 제약 조건 위반의 경우에만 해결할 수 있다고 생각했습니다. 데이터가 업데이트되지 않으면 중단 할 위반 사항도 없습니다.제약 조건을 위반하는 업데이트 문을 사용해 볼 수 있습니까 (예 : 기존의 다른 키 값으로 기본 키 값을 업데이트하는 경우)? – tiguchi

+0

@ Nobu SQliteAbortException이 예상대로 작동하지 않습니다. 그래서 비 고유 키로 인해 위반이 발생할 것이라는 것을 알았던 곳에 업데이트 대신 INSERT를 시도했습니다. 효과가 없습니다. 그러나 SQLiteConstraintException로 변경하면 오류가 발생합니다. 두 경우 모두 UPDATE를 사용하면 제약 조건 위반 오류는 기대하지 않지만 오류는 발생하지 않습니다. – TrustNoOne

답변

1

Android API 레벨 19의 Java 소스 코드 부분에서 해당 동작에 대한 설명을 찾으려고 시도했지만 SQLiteAbortException이 (다시) throw되는 유일한 곳은 DatabaseUtils이라는 정적 도우미 클래스에 있습니다. 원래는 android_database_SQLiteCommon.cpp에있는 메소드를 사용하여 원시 코드에서 발생합니다. 내가 강하게 C 콜백 함수가 그와 함께 의미 가정

/* 콜백 루틴이 요청한 중단 */

: SQLite는이 SQLITE_ABORTdocumented as라는 오류 코드 4를 반환 할 때이 발생합니다. SQLite를 사용하여 콜백을 등록 할 수 있으며 일정 수준의 제어 권한이있는 것 같습니다. 따라서 SQLiteAbortException으로 변환 된 오류 코드는 SQL ABORT 절과 관련이 거의 없습니다. 사실 안드로이드의 SQLite 데이터베이스 드라이버의 본래 부분이 요청을 중단하는 SQLite로 콜백을 후킹한다고 생각하지 않기 때문에 그 예외가 던져 질지는 의심 스럽다.

SQLite documentation of ABORT 또한 특정 에러 코드의 종류가 기대되는 : 적용 가능한 제약 조건 위반이 발생하면

을 중단는 ABORT 해상도 알고리즘은 와 현재 SQL 문을 중단 SQLITE_CONSTRAINT 오류 (... snip)

SQLite의 설명서와 원시 안드로이드 소스 코드가 실제로하는 것에 따르면, SQLiteConstraintException이 그 경우에 예상되며 분명히 SQLiteAbortException의 안드로이드 문서는 완전히 정확하지 않습니다.

+0

그 모든 것을 파헤쳐 줘서 고마워! 다시 SQLiteAbortException에 보고서를 넣고이 스레드를 연결합니다. 분명히 내 오해 (또는 너무 높은 기대)도 업데이트 실패로 인해 SQLite가 fail 또는 abort 절로 분기하게됩니다. 그 경우에는 나타나지 않으며 업데이트가 실패했는지 확인하는 유일한 방법은 변경된 행 수를 확인하는 것입니다. – TrustNoOne

관련 문제