首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将Transformations.switchMap放在存储库中?

是否可以将Transformations.switchMap放在存储库中?
EN

Stack Overflow用户
提问于 2019-08-12 16:46:46
回答 1查看 165关注 0票数 0

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

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

同时,数据库和存储库都是单一的。

Activity.java

代码语言:javascript
复制
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从不更新,也不会显示除null以外的值。

ViewModel.java

代码语言:javascript
复制
...
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

代码语言:javascript
复制
...
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

代码语言:javascript
复制
@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如何无法读取存储库中的新对象?

如果需要更多的代码来理解问题,只需问一问。我完全被这件事弄糊涂了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-15 15:46:47

简单地说,你可以。Transformations.switchMap()不是LiveData不更新的问题。还不知道如何从服务中与数据库通信(跟进问题Insert to room in service not updating LiveData in activity ),还可以通过不同的方式解决这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57465151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档