Với cơ sở dữ liệu Phòng mới trong Android, tôi có một yêu cầu nơi có hai cuộc phẫu thuật liên tiếp mà cần phải được thực hiện:Phòng Android cơ sở dữ liệu giao dịch
removeRows(ids);
insertRows(ids);
Nếu tôi chạy này, tôi thấy (trên kiểm tra db) có một số hàng bị thiếu - tôi cho rằng chúng đang bị xóa sau khi chèn. viz. hoạt động đầu tiên chạy song song với lần thứ hai.
Nếu tôi sử dụng một khối giao dịch, như thế này, thì đó là tất cả tiền phạt - hoạt động đầu tiên dường như để hoàn thành trước khi thực hiện thứ hai:
roomDb.beginTransaction();
removeRows(ids);
roomDb.endTransaction();
insertRows(ids);
Nó cũng tốt nếu tôi cung cấp cho một giấc ngủ ở giữa thay vì :
removeRows(ids);
Thread.sleep(500);
insertRows(ids);
Hiện không có vẻ được nhiều tài liệu cho phòng, và đã tự hỏi nếu tôi nên sử dụng các khối giao dịch như trên khi tôi có hoạt động liên tục được thực hiện, hoặc là có cách nào tốt hơn để làm nó.
EDIT: Sau @CommonsWare chỉ ra, @Query
là không đồng bộ, trong khi @Insert
và @Delete
là đồng bộ. Trong quan điểm này, làm thế nào tôi sẽ nhận được một truy vấn mà xóa hàng để được async:
@Query("DELETE from table WHERE id IN(:ids)")
int removeRows(List<Long> ids);
Theo build ra tôi nhận được Deletion methods must either return void or return int (the number of deleted rows)
, nếu tôi cố gắng quấn kiểu trả về trong một Flowable
.
gì chính xác là những hiện thực của 'removeRows()' và 'insertRows()'? Nếu chúng là các phương thức '@ Delete' và' @ Insert' DAO đơn giản, thì chúng nên được tuần tự hóa một cách tự nhiên, vì các phương thức đó được thực thi đồng bộ. Nơi duy nhất mà Room thực hiện công cụ không đồng bộ là trên '@ Query' với giá trị trả về (' LiveData', 'Flowable', v.v.). – CommonsWare
@CommonsWare, vâng, trong khi 'insertRows()' là '@ Insert' đơn giản,' removeRows() 'có các cuộc gọi' @ Query'. Tôi đoán điều đó giải thích nó. Vì vậy, tôi đoán câu trả lời cho câu hỏi của tôi là đăng ký phản ứng phản ứng của các truy vấn. – rajath
@CommonsWare, Cảm ơn sự giúp đỡ của bạn. Tôi đã chỉnh sửa câu hỏi theo dõi dựa trên nhận xét của bạn. Làm thế nào tôi có thể viết một '@ Query' có một' DELETE' để nó có thể quan sát nó cho đến khi hoàn thành? – rajath