【问题标题】:Is it possible to place Transformations.switchMap in a repository?是否可以将 Transformations.switchMap 放在存储库中?
【发布时间】:2019-08-12 16:46:46
【问题描述】:

我正在尝试实现对通过 gps 和蓝牙收集的数据的 LiveData 引用,这些数据也按外键分组。我不明白为什么创建新外键后 Transformations.switchMap 不会触发。

我已经移动了观察者和外键的创建,LiveData 总是返回 null。

数据库和存储库都是单例。

Activity.java

public class Activity extends AppCompatActivity {
    ...
    private ViewModel mViewModel;

    @Override
    onCreate {
        ...
        mViewModel = ViewModelProviders.of( this ).get( ViewModel.class );

        init();
    }

    private class ObserverManager {

        private List<Observer> observers = new ArrayList<>();
        private List<LiveData> livedata = new ArrayList<>();

        public void registerObserver( TextView view, int hid, int uid ) {

            Observer observer = null;
            LiveData ld = null;


            ld = mViewModel.getLatestData();

            observer = ( Observer<Float> ) ( @Nullable final Float data ) -> {

                // String formatting...

            };

            observers.add( observer );
            livedata.add( ld );

            ld.observeForever( observer );

        }

        public void logValue( int index ) {

            Log.d( "OBSERVERMANAGER", String.valueOf( livedata.get( index ).getValue() ) );

        }

    }

    final ObserverManager mObserverManager = new ObserverManager();
}

在 init() 期间插入和更新外键,然后动态附加观察者。

服务记录正确的外键并将值插入 eData 实体,但 Transformations.swapMap 永远不会更新,或显示非空值。

ViewModel.java

...
private LiveData<Integer> mLiveActivityId;
private LiveData<Float> mLatestData;

ViewModel( Application application ) {
    ...
    mLiveActivityId = mRepository.getLiveActivityId();
    mLatestData = mRepository.getLatestData();
}

public LiveData<Float> getLatestData() {
    return mLatestData;
}

Repository.java

...
private LiveData<Integer> mLiveActivityId;
private LiveData<Float> mLatestData;

Repository( Application application ) {
    ...
    mLiveActivityId = mDataDao.getLiveActivityId();
    mLatestData = Transformations.switchMap( mLiveActivityId, aid -> mDataDao.getLatestData( aid, 0 ) );
}

...
LiveData<Float> getSpeedGPSLatest() {
    return mSpeedGPSLatest;
}

DataDao.java

@Transaction
@Query( "SELECT id FROM eActivity WHERE active = 1" )
LiveData<Integer> getLiveActivityId();

@Transaction
@Query( "SELECT data FROM eData WHERE aid = :aid AND source = :source AND time = " +
            "( SELECT MAX(time) time FROM eData WHERE aid = :aid AND source = :source )" )
LiveData<Float> getLatestData( int aid, int source );

甚至可以在存储库中应用转换吗?到目前为止,我只看到了将它们应用于 ViewModel 的示例。不幸的是,由于某些数据与类型字段共享同一实体,这意味着我必须将 LiveData 对象从存储库中的函数传回,我认为这是错误的。

我还了解到 switchMap 创建了一个新的 LiveData 对象,这会以某种方式影响 ViewModel 无法读取存储库中的新对象吗?

如果需要更多代码来理解问题,请询问。我完全被这件事难住了。

【问题讨论】:

  • 您必须观察LiveData 才能获得回调。你在哪里观察mLatestData
  • 更新了问题以显示我如何附加观察者,可以确认 livedata[] 持有 livedata,并且观察者已附加,但它们始终返回 null。
  • 我开始认为将内部查询放入 where 子句会导致 livedata 不更新。明天去试试inner join。
  • 在此处查看更新的问题:stackoverflow.com/questions/57495102/…

标签: java android android-room


【解决方案1】:

简单地说,是的,你可以。 Transformations.switchMap() 不是 LiveData 未更新的问题。仍然无法弄清楚如何从服务与房间数据库通信,即后续问题Insert to room in service not updating LiveData in activity,但也通过不同的方式解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2011-01-16
    相关资源
    最近更新 更多