2013-01-06 32 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; 
} 

}