2013-04-23 152 views
3

我正在開發和android應用程序,我經常使用它訪問本地數據庫。這個數據庫可以從不同的therads訪問,所以我對數據庫有一個協調問題。我使用以下open()close()方法。Android:打開和關閉SQLite數據庫

public void open(){ 
    mDb=mDbHelper.getWritableDatabase(); 
} 

public void close(){ 
     mDb.close(); 
} 

所以,通常情況下,當我需要訪問數據庫的某些操作我打開數據庫,然後我執行一些操作,最後我關閉數據庫。我通常使用用於此目的的代碼如下:

try { 
     dbManager.open(); 
        // database operation 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }finally{ 
     try { 
      dbManager.close(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

但是,如果此片的代碼是從differnts線程使用(假設線程A和線程B)下面可能情況發生:

A thread: performs open() 
B thread: perfroms open() 
A thread: perfroms some operation 
A thread: performs close() 
B thread: try to perform some operation but it fails! 

因此,當我的應用程序啓動時,我猜想我可以執行的唯一解決方案是open(),而當我的應用程序停止時,我可以執行close()。我不確定這是否是一個好的解決方案?

實際上,getWritableDatabase()方法的文檔(從我open()稱呼)說:

Make sure to call close() when you no longer need the database 

所以,任何人都可以提出我的替代解決方案?

+1

不關閉數據庫,僅僅只是接近光標到數據 – umesh 2013-04-23 14:10:14

+0

同步訪問或在一個線程中只有 – 2013-04-23 14:15:36

+0

做分貝OPS ...或建立的ContentProvider ... – Selvin 2013-04-23 14:16:31

回答

1

創建一個包裝類,添加一個原子整數成員,並且每次打開數據庫時,增加成員,關閉它時,遞減成員,如果成員爲零,則實際關閉數據庫。

+1

像信號????? – stinepike 2013-04-23 14:26:04

+1

不,你將有一個原子整數來知道什麼時候真正關閉數據庫,並且你將在包裝器和封裝器內部調用close,只有當這個int爲0時,你纔會關閉數據庫 – 2013-04-24 06:58:31