2013-01-06 33 views
7

我的應用程序中有一箇中央數據庫,有幾個不同的活動需要訪問。Android/Java:從多個活動訪問相同的SQLite數據庫對象

我應該通過使其靜態分享此對象嗎?例如像在初始化數據庫的活動我這樣做:

protected static appDatabase db; 

然後其他人可以通過FirstActivity.db訪問它。

另一種選擇是在需要它的每個活動中創建private appDatabase db對象,但我懷疑打開多個數據庫對象來訪問相同的存儲數據可能會造成浪費。

但是我不太瞭解java,這就是爲什麼我問 - 爲什麼要這樣做?

謝謝

+0

在我的應用程序犯規此類對象使用靜態的。也許它是首選,但我沒有做到。有趣的是看到你得到的答案。 –

+0

你可以使用單身? – fge

+0

我通常在我的專業環境中使用ContentProvider背後的數據庫,並且發現確保一次只存在一個數據庫連接(使用@fge建議的單例模式)可幫助我處理一些數據一致性問題,並避免「sqlite誤用例外」。我想知道這些參數是如何在非ContentProvider環境中保持的,因此提出了問題。也許回答你的問題的人也可以提到我們可以預期多重性能與單一連接有多大的性能優勢? :D – baske

回答

4

你可以像這樣使用單身人士;

private static DataHelper singleton; 

    public static DataHelper getDataHelper(Context context) { 
      if (singleton == null) { 
        singleton = new DataHelper(context); 
        OpenHelper openHelper = new OpenHelper(singleton.context); 
        singleton.db = openHelper.getWritableDatabase(); 
      } 
      if(!singleton.db.isOpen()){ 
        OpenHelper openHelper = new OpenHelper(singleton.context); 
        singleton.db = openHelper.getWritableDatabase(); 
      } 
      singleton.context = context; 
      return singleton; 
    } 

    private DataHelper(Context context) { 
     this.context = context; 
} 

然後像這樣調用你的單例類;

public DataHelper dh; 
this.dh = DataHelper.getDataHelper(this); 
1

我使用Application類和同步數據庫對象管理來處理這種情況。這是一個例子。 [synchronized]限定符是多線程應用程序中的關鍵。

根據定義,Application對象是Android中的Singleton。

public class App extends Application 
{ 

private static App _instance; 
private AppLocalStorage _localStorage; 

@Override 
public void onCreate() 
{ 
    super.onCreate(); 

    _instance = this; 
} 


public static App getInstance() 
{ 
     //Exposes a mechanism to get an instance of the 
     //custom application object. 
     return _instance; 
} 

public synchronized AppLocalStorage getDatabase() 
{ 
    if (_localStorage == null) 
    { 
     _localStorage = new AppLocalStorage(this); 
    } 

    return _localStorage; 
} 

}