2013-01-06 12 views
7

Mam centralnej bazy danych w mojej aplikacji, że kilka różnych działań musi uzyskać dostęp.Android/Java: uzyskiwanie dostępu do tego samego SQLite DB obiektu z wielu działań

Czy powinienem udostępnić ten obiekt, czyniąc go statycznym? Jak na przykład w działalności, która inicjuje DB zrobić to:

protected static appDatabase db; 

Wtedy inni mogą uzyskać do niego dostęp za pośrednictwem FirstActivity.db.

Inną opcją jest utworzenie obiektów o wartości private appDatabase db we wszystkich działaniach, które tego wymagają, ale podejrzewam, że otwieranie wielu obiektów db w celu uzyskania dostępu do tych samych przechowywanych danych może być marnotrawstwem.

Jednak nie wiem zbyt wiele o java, dlatego właśnie pytam - jaki jest preferowany sposób na zrobienie tego i dlaczego?

Dzięki

+0

W mojej aplikacji robi używać statycznego na takich obiektach. Może jego preferowane, ale ja tego nie zrobiłem. Interesujące, aby zobaczyć, jakie odpowiedzi otrzymasz. –

+0

Możesz użyć singletonu? – fge

+0

Zwykle pracuję z bazami danych znajdującymi się za ContentProvider w moim środowisku zawodowym i odkryłem, że zapewnienie tylko jednego połączenia z bazą danych w danym momencie (z wykorzystaniem pojedynczego wzorca, jak sugeruje @fge) pomaga mi uporać się z pewnymi problemami z spójnością danych i uniknąć "nadużycia sqlite" wyjątki ". Zastanawiam się, jak te argumenty utrzymują się w środowisku, które nie jest ContentProvider i dlatego wznowiłem twoje pytanie. Być może osoba, która odpowie na twoje pytanie, może także wspomnieć, jak duże korzyści z wydajności możemy oczekiwać w przypadku połączeń wielokrotnych vs pojedynczych? : D – baske

Odpowiedz

4

Możesz użyć singleton w ten sposób;

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; 
} 

I zadzwoń do swojej singletonowej klasy w ten sposób;

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

Zajmuję się tą sytuacją za pomocą zarządzania obiektami klasy i zsynchronizowanego obiektu bazy danych. Oto przykład. Kwalifikator [zsynchronizowany] jest kluczem w aplikacji wielowątkowej.

Z definicji obiektem aplikacji jest Singleton w systemie Android.

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; 
} 

}

Powiązane problemy