2017-06-23 25 views
8

, iki ardışık işlemler yapılması gerektiğini vardır bir şartı var) bazı satırların eksik olduğu - yerleştirildikten sonra silinmekte olduğunu farz ediyorum. yani. İlk işlem, ikinci paralelde koşuyor. Bir işlem bloğu kullanırsanızAndroid Odası veritabanı işlemleri Android'de yeni Odası Database ile

, bunun gibi, o zaman ince hepsi - Birinci operasyon ikinci yapmadan önce tamamlamak için görünüyor: Ben yerine aralarında mükemmel bir uyku verirsen

roomDb.beginTransaction(); 
removeRows(ids); 
roomDb.endTransaction(); 

insertRows(ids); 

Ayrıca gayet :

removeRows(ids); 
Thread.sleep(500); 

insertRows(ids); 

orada Odası için çok dokümantasyon olmak görünmüyor, ben de yapılması gereken sıralı işlemleri varken yukarıdaki gibi işlem bloğu kullanmalısınız acaba, ya yapmanın daha iyi bir yol yoktur o.

DÜZENLEME: @CommonsWare işaret sonra @Insert ve @Delete senkron iken, @Query, asenkron bulunmaktadır. Bir Flowable dönüş türünü sarmak için çalışırsanız, ben Deletion methods must either return void or return int (the number of deleted rows) olsun inşa çıkışına göre

@Query("DELETE from table WHERE id IN(:ids)") 
int removeRows(List<Long> ids); 

: Bu bakışa göre, nasıl satırlar zaman uyumsuz olması silen bir sorgu tanınacak.

+1

tam 'removeRows()' ve 'InsertRows()' gerçeklenimcilerine nelerdir? Eğer '@ Delete' ve' Insert 'DAO metotları düzse, bu yöntemler senkronize olarak yürütüldüklerinden, doğal olarak serileştirilmelidirler. Oda'nın eşzamansız şeyler yaptığı tek yer, reaktif bir dönüş değeri olan '@ Query' üzerindedir (' LiveData'', Flowable' vb.). – CommonsWare

+0

@CommonsWare, evet, insertRows() 'basittir' Ekle ', 'removeRows()' 'Query' çağrıları vardır. Sanırım bunu açıklıyor. Yani, sanırım soruma cevap, Sorguların tepkisel yanıtına abone olmaktır. – rajath

+0

@CommonsWare, Yardımlarınız için teşekkürler. Sorunuzu, yorumunuza dayalı bir takip ile düzenledim. Tamamlanana kadar gözlemleyebilmem için 'DELETE 'yapan bir' @ Query' nasıl yazabilirim? – rajath

cevap

5

@CommonsWare işaretli olarak, @Query asynchronous iken @Insert, @Delete, @Update eşittir.

Tek işlemde birden çok sorgu yürütmek istiyorsanız, Oda ayrıca aşağıda belirtildiği gibi bir yöntem sağlar.

roomDB.runInTransaction(new Runnable() { 
     @Override 
     public void run() { 
      removeRows(ids); 
      insertRows(ids); 
     } 
    }); 

Umarım bu sizin sorununuzu çözer.

5

Transaction belgelerine üzerinde belirttiği gibi, aşağıdakileri yapabilirsiniz:

@Dao 
public abstract class ProductDao { 
    @Insert 
    public abstract void insert(Product product); 

    @Delete 
    public abstract void delete(Product product); 

    @Transaction 
    public void insertAndDeleteInTransaction(Product newProduct, Product oldProduct) { 
     // Anything inside this method runs in a single transaction. 
     insert(newProduct); 
     delete(oldProduct); 
    } 
} 
+0

Eğer arayüz kullanıyorsam? –

+2

@johnny_crq Arabirim kullanıyordum ve soyut sınıflara geçmek zor değildi. Alternatif olarak, bir yöntem üzerinden '@Transaction @Query (" DELETE FROM products; INSERT INTO products VALUES (x, y, z) ") arayüzündeki bu çirkin numarayı deneyebilirsiniz. – guness

İlgili konular