Class (Datenbank) nur einmal instanzieren

znieh99

znieh99

Fortgeschrittenes Mitglied
12
Hallo Forum,
ich versuche mich gerade an meiner ersten Datenbank und habe anhand des Buches "Android 4.4" von Arno Becker eine Datenbank-Struktur erstellt und möchte nun darauf zugreifen. Schon beim Schreiben der Anweisung "mDB = new UniverseDB.getInstance(this);" bekomme ich den Hinweis Cannot resolve Symbol 'getInstance(this)'.
Ich kann mir vorstellen, dass hier etwas mit dem Klassen-Zugriff nicht stimmt, aber was?
Hier die Code Segmente:
Aufrufende Activity:
Code:
package com.app.heinz.testdatabase;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;


public class MainActivity extends AppCompatActivity {
    private  UniverseDB mDB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mDB = new UniverseDB.getInstance(this);   <-- hier: Cannot resolve Symbol 'getInstance(this)' 
    }
}

DB Class:
Code:
public class UniverseDB extends SQLiteOpenHelper {

    private static final String DATABASE_NAME = "universe.db";
    private static final int DATABASE_VERSION = 1;

    private static UniverseDB mINSTANCE;            //eigene Instance
    private static Object mLOCK = "";


    /**
     * Die Klasse wird über getInstance zur Selbst-Instanzierung aufgerufen.
     * @param context = Aufrufende Anwendung
     * @return = das einzige Exemplar dieser Klasse welches verwendet werden darf.
     */
    public static UniverseDB getInstance(Context context) {
        if(mINSTANCE == null) {
            synchronized(mLOCK) {
                if(mINSTANCE == null) {
                    mINSTANCE = new UniverseDB(context);
                }
            }
        }
        return mINSTANCE;
    }           //end getInstance -----------------------------------------

    /**
     * Der Konstruktor darf nur von getInstance aufgerufen werden,
     * um mehrere Exemplare zu verhindern
     * @param context = Context der aufrufenden Anwendung
     */
    private UniverseDB(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }           //end Konstruktor UniverseDB ------------------------------

    /**
     * Erstellen der Datenbank
     * @param db
     */
    @Override public void onCreate(SQLiteDatabase db) {
        db.execSQL(StepQuery.SQL_CREATE);
    }           //end onCreate ------------------------------------
 
Hallo , ich habe auch ein gleichartiges Konstrukt, im synchronized(mLOCK) - Block gibt es bei mir aber noch ein Zähler
damit ich die Datenbank auch sauber schließen kann, beim Placebo-Close wird der Zähler dekrementiert und erst bei
Stand:0 wird die Datenbank tatsächlich geschlossen. Ansonsten würde es Probleme mit "mehreren" angeforderten Instanzen.
Das Placebo-Close hat natürlich auch ein synchronized(mLOCK) - Block ! Bei getInstance wird dann nicht "nur"
if(mINSTANCE == null) geprüft, sondern primär ob der Zähler 0 ist oder nicht.
 
Bei der Angelegenheit solltet ihr aber darauf achten, das die Referenzen immer aufgelöst werden. Sonst hält euer Singelton alle möglichen Objekte am Leben.

Eine andere Möglichkeit wäre es mit Transaktionen zu arbeiten.
Transaktion (Informatik) – Wikipedia
 

Ähnliche Themen

S
Antworten
33
Aufrufe
2.673
Sempervivum
S
S
  • softwareunkundig
Antworten
1
Aufrufe
886
jogimuc
J
Zurück
Oben Unten