2012-08-03 51 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方法處理任何錯誤,如果此方法拋出異常,我的數據庫仍然存在打開。我認爲這不是很好,但不確定在try/catch塊上添加新內容是否是這種情況的最佳解決方案。

回答

2

如果不出意外,你應該使用finally。您進一步反正拋出異常,所以也懶得追趕它在所有:

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

的另一件事是,你不應該打開的一個操作數據庫,並再次關閉它,因爲那是SLOW。您至少應該有db,至少可以使用ActivityService。其擺脫了外getWritableDatabase()/close對,所以你到:

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

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

。注意,這不是讓到endTransaction如果beginTransaction拋出,這可以很容易地發生。我不清楚Android包裝器,因爲我通常使用C API,但C API不會等待鎖定數據庫,而是在數據庫已被其他事務鎖定時立即失敗。很顯然,RAII或上下文管理器會更短,但不幸的是,Java並沒有(更新:Java 8確實有try(variable),但Android堅持使用Java 6;但是,它應該在Kotlin中得到支持,即使這樣也是如此目標)。

+0

如果不需要getWritableDatabase,怎麼分貝如果不通過DB = getWritableDatabase聲明()? – seekingStillness 2018-02-08 13:55:52

+1

@seekingStillness,它*是*需要的。我只是說你應該保留一個活動或服務的成員,而不是爲每個操作創建一個。 – 2018-02-08 23:01:27