[英]Observing Room DAO with LiveData not being triggered
嘗試使LiveData與Room一起使用:
有實體對象:
@Entity
public class TimeEntry{
....
道:
@Dao
public interface TimeEntryDAO {
@Query("SELECT * FROM " + TimeEntry.TIME_TABLE_NAME)
LiveData<List<TimeEntry>> getAll();
...
活動內部:
protected void onCreate(Bundle savedInstanceState) {
...
AppDatabase db = AppDatabase.getInstance(mContext);
db = AppDatabase.getInstance(getApplicationContext());
tDAO = db.timeEntryDao();
tDAO.getAll().observe(this, new Observer<List<TimeEntry>>() {
@Override
public void onChanged(@Nullable List<TimeEntry> mTimeEntries) {
if (mTimeEntries != null) {
loadSelectedDates(mTimeEntries); //updates a calendarUI
}
}
});
requestImmediateTimeSync(SyncAdapter.GET_USER_TIMES); //Calls syncAdapter
...
在SyncAdapter內部:
public void onPerformSync(....
...
AppDatabase db = AppDatabase.getInstance(mContext);
TimeEntryDAO tDAO;
tDAO = db.timeEntryDao();
...
tDAO.insertAll(new TimeEntry(...))
...
我一直希望在我的活動中,因為我正在觀察tDAO.getAll(),所以它將在完成同步后刷新日歷。 現在,您必須重新加載活動以獲取執行同步后放入數據庫的數據。 我是Room和LiveData的新手。 有任何想法嗎? 希望我沒有花太多的代碼,這是到目前為止的一個相當大的應用程序。
我最終使用了SyncObserver而不是實時數據,因為SyncAdapter確實是我應該監視的對象。 以下是一些摘要:
ContentResolver.requestSync(MainActivity.mAccount, getApplicationContext().getResources().getString(R.string.authority), bundle);
...
final int mask = ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE;
mSyncObserverHandle = ContentResolver.addStatusChangeListener(mask, mSyncStatusObserver);
稍后的:
private SyncStatusObserver mSyncStatusObserver = new SyncStatusObserver() {
@Override
public void onStatusChanged(final int which) {
//Check to see if DAO has anything here, if so, run this thread
runOnUiThread(new Runnable() {
@Override
public void run() {
//Do the update thing
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.