Наблюдение за комнатами DAO с LiveData, которые не запускаются

Попытка заставить LiveData работать с Room:

Иметь объект Entity:

@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. Любые идеи? Надеюсь, я не вынул слишком много кода, пока это из довольно большого приложения.


person ejo4041    schedule 10.04.2018    source источник


Ответы (1)


В итоге я использовал 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
            }
         }
}
person ejo4041    schedule 11.04.2018
comment
У меня тоже есть эта проблема, Room не запускает диспетчер синхронизации для запроса синхронизации. - person Brill Pappin; 31.10.2018