当前位置: 首页 > 知识库问答 >
问题:

LiveData未触发的观察室DAO

习淇
2023-03-14

试图让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
...
public void onPerformSync(....
...
    AppDatabase db = AppDatabase.getInstance(mContext);
    TimeEntryDAO tDAO;
    tDAO = db.timeEntryDao();
...
    tDAO.insertAll(new TimeEntry(...))
    ...

因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。

共有1个答案

鲍鸿波
2023-03-14

我最终使用了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
            }
         }
}
 类似资料:
  • 我有一个视图模型,从场景中接收流作为livedata 在活动中,我们订阅了这个livedata,一些逻辑发生并使用了activityResult 当我们返回时,我们会用最后一个状态触发一个观察者,并再次执行之前的导航逻辑 如何忽略返回时具有相同值的观察者触发器?

  • 我尝试使用这个实现ViewModel。但观察者从未被调用。 基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。 我在这里做错了什么? BookActivity类: BookViewModel类

  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac