2016-07-27 5 views
0

Ich benutze Android SQLiteOpenHelper meine sqlite-Datenbank zu behandeln.Multi-Threaded mehrere SQLite-Befehle android Fehler

Ich versuche, eine riesige Menge an Datenbankbefehlen im Hintergrund mit einer einfachen asynctask zu tun, so dass der Benutzer die Verzögerung nicht bemerkt, die es auf dem Hauptthread geben würde. Wenn es mehrere (eine große Menge) Befehle gibt, bekomme ich immer den Datenbankkant Open Fehler.

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file (code 14) os_unix.c:31278: (24) open(/data/user/0/com.locomain.app/databases/app.db-journal) 

Dies passiert nicht, wenn ich den Befehl eine kleine Anzahl von Zeiten aufrufen.

Ich habe bereits die anderen Threads zu diesem Thema überprüft und auch einige Google-Suchanfragen gemacht, aber ich konnte die Anwsser nicht finden.

mein Code:

public void addTag(Tag tag){ 
    final SQLiteDatabase db = getWritableDatabase(); 
    final ContentValues values = new ContentValues(1); 
    db.beginTransaction(); 

    values.put(TagColumn.TAG_NAME,tag.getName()); 

    db.insert(TagColumn.TABLE_NAME,null,values); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
} 
+0

Etwas anderes hat bereits die Datei geöffnet. Haben Sie 2 Instanzen der Hilfsklasse? Es wird allgemein als am besten angesehen, diese Klasse zu einem Singleton zu machen, um dieses Problem zu vermeiden. –

+0

nein, es ist ein Singleton – locomain

Antwort

-1

Ihre Methoden machen, die synchronized db verwenden.

Versuchen Sie Threads anstelle von AsyncTasks zu verwenden, es ist sowieso besser.

Sind Sie sicher, Transaktionen zu verwenden? Es verlangsamt wirklich Ihre Einsätze.

+0

Ich machte den SQLiteOpenHelper selbst synchronisiert. aber die Android Richtlinien sagen, dass man asynctask über Threads verwenden sollte, richtig? Was wäre eine schnellere Methode für diese rohe Abfrage? – locomain

+0

Das Problem dabei ist, dass die AsyncTask einen impliziten Verweis auf die umschließende Aktivität hat. Wenn eine Konfigurationsänderung auftritt, wird die Activity-Instanz, die die AsyncTask gestartet hat, zerstört, aber nicht GCd, bis die AsyncTask beendet ist. Thread wird es nicht schneller machen. Und ich sehe keinen Vorteil AsyncTask anstelle von Thread zu verwenden, sie sind ähnlich, aber Thread ist stabiler. – DEADMC

Verwandte Themen