2012-08-03 3 views
0

오류 처리가 더 명확하고 읽기 쉽도록 할 수 있습니까?SQLiteOpenHelper의 오류 처리를 최적화하는 방법

public synchronized void doSomeTrans(...) throws Exception { 
    Exception ex = null; 
    SQLiteDatabase db = null; 
    boolean bTrans = false; 

    try { 
     db = getWritableDatabase(); 

     db.beginTransaction(); 
     bTrans = true; 

     db.execSQL(...); 
     db.execSQL(...); 

     db.setTransactionSuccessful(); 
    } 
    catch (Exception ex1) { 
     ex = ex1; 
    } 

    if (db != null) { 
     if (bTrans != false) 
      db.endTransaction(); 

     db.close(); 
    } 

    if (ex != null) 
     throw ex; 
} 

는 또한, 내 버전에서 내가 어떤 오류가 endTransaction을 방법을 중심으로 처리하고이 메소드는 예외를 throw하는 경우 내 데이터베이스가 여전히 열려 존재하지 않습니다 내 버전은 부피가 조금처럼 보인다. 나는 그것이 좋지 않다고 생각하지만 try/catch 블록에 새로운 것을 추가하는 것이이 경우를위한 최선의 해결책이라는 것을 확신하지 못한다.

답변

2

그 밖의 것이 없으면 finally을 사용해야합니다. 즉 때문에,

try { 
    db = getWritableDatabase(); 
    ... 
} finally { 
    if (db != null) { 
     if (bTrans != false) 
      db.endTransaction(); 
     db.close(); 
    } 
} 

다른 것은 당신이 하나 개의 작업에 대한 데이터베이스를 열고 다시 닫을해야한다는 것입니다 : 당신은 더 어쨌든 예외를 던지고있다, 그래서 전혀 잡기 귀찮게하지 않습니다 천천히. 적어도 Activity 또는 Service의 평생 동안 db 주위에 있어야합니다. 어느 외부 getWritableDatabase()/close 페어를 제거한다, 그래서 당신은 아래에 있습니다 : beginTransaction 쉽게 일어날 수있는 슬로우 경우 즉 endTransaction에 점점이 아니라고,

db.beginTransaction(); 
try { 
    db.execSQL(...); 
    db.execSQL(...); 

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

참고. 나는 C API를 일반적으로 사용하기 때문에 안드로이드 래퍼에 대해 확신하지 못한다. 그러나 C API는 데이터베이스 잠금을 기다리지 않고 데이터베이스가 다른 트랜잭션에 의해 잠겨있을 때 즉시 실패한다.

분명히 RAII 또는 컨텍스트 관리자는 더 짧을 것이지만 불행히도 Java는 (업데이트 : Java 8에는 try(variable)이 있지만 Android는 Java 6에 고정되어 있지만 Kotlin에서도 지원되어야합니다. 목표).

+0

getWritableDatabase가 필요하지 않은 경우 db = getWritableDatabase()가 아닌 경우 db를 선언하는 방법은 무엇입니까? – seekingStillness

+1

@seekingStillness, * * 필요합니다. 나는 각 작업을 위해 활동이나 서비스를 만들지 않고 활동이나 서비스의 구성원에 주위를 지켜야한다고 말한 것입니다. –

관련 문제