2013-01-15 10 views
6

Moja aplikacja zużywa zdalny interfejs REST API i wypełnia lokalną bazę db greenDao. Mam usług z klasy AsyncTask:Jak połączyć wiele operacji greenDAO Tx w jedną transakcję?

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

Wewnątrz każdej metody wstawiania mam insertOrReplaceInTx, którego używam głównie do przyrostu wydajności.

Potrzebuję, aby porzucić wyniki, jeśli któraś z metod nie odzyskać danych. To powinno być zrobione przez tę samą transakcję.

Zastanawiam się, czy dobrze jest otoczyć moje wywołania metody insert z mDaoSession.callInTx(callable) mając wewnątrz metody insertOrReplaceInTx. Czy mam rację?

Dodatkowo, w jaki sposób mogę zrezygnować z transakcji w przypadku zgłoszenia wyjątku - czy odbywa się to automatycznie za pomocą greenDao?

Odpowiedz

9

Tak używać callInTx jeśli kod może rzucić wyjątek (jeśli nie można również rozważyć runInTx. Android SQLite API dba o tych „zagnieżdżonych” transakcji.

Wszakże callInTx to tylko niektóre linie wygody if spojrzeć na kod źródłowy:

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

to działa - ładny – midnight

+1

Jeśli pierwszy insertInTx uda, a drugi nie, nie będzie pierwszy zestaw obiektów pozostają w pamięci podręcznej sesji chociaż DB wycofana! transakcja? – Monstieur

Powiązane problemy