2013-01-15 5 views
6

Meine Anwendung verwendet die Remote-REST-API und füllt die lokale Datenbank mit greenDao. Ich habe einen Dienst mit AsyncTask Klasse:Wie kombinieren Sie mehrere greenDAO Tx-Operationen in einer Transaktion?

@Override 
protected Void doInBackground(Void... params) { 
    insert100RowsIntheFirstTable(); 
    insert100RowsIntheSecondTable(); 
} 

Innerhalb jeder Einsatz-Methode, die ich insertOrReplaceInTx, die ich in erster Linie für die Leistungssteigerung nutzen.

Was ich brauche ist, um Ergebnisse zu verlassen, wenn eine der Methoden Daten nicht abrufen kann. Es soll durch die gleiche Transaktion geschehen.

Ich frage mich, ob es richtig ist, meine Insert-Methode Anrufe mit mDaoSession.callInTx(callable) umgeben, während insertOrReplaceInTx innerhalb der Methoden haben. Habe ich recht?

Wie kann ich die Transaktion abbrechen, wenn eine Ausnahme ausgelöst wird - wird das automatisch mit greenDao gemacht?

Antwort

9

Ja verwenden callInTx wenn Ihr Code eine Ausnahme auslösen kann (wenn nicht auch runInTx betrachten können. Android SQLite API kümmert sich um diese „verschachtelten“ -Transaktionen.

Immerhin callInTx ist nur ein paar Zeilen von Bequemlichkeit, wenn Sie schauen auf den Quellcode:

public <V> V callInTx(Callable<V> callable) throws Exception { 
    db.beginTransaction(); 
    try { 
     V result = callable.call(); 
     db.setTransactionSuccessful(); 
     return result; 
    } finally { 
     db.endTransaction(); 
    } 
} 
+0

es gearbeitet hat - schön – midnight

+1

Wenn die erste insertInTx gelingt und die zweite ausfällt, wird nicht der erste Satz von Objekten in der Session-Cache bleiben, auch wenn die DB zurückgerollt! die Transaktion? – Monstieur