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

时间:2019-08-12 16:46:46

标签: java android android-room

我正在尝试对通过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从不更新,或显示非null的值。

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无法读取存储库中的新对象吗?

如果需要更多代码来理解该问题,只需询问。完全为此感到困惑。

1 个答案:

答案 0 :(得分:0)

简单地说,是的,可以。 LiveData没有更新,不是Transformations.switchMap()的问题。仍然无法弄清楚如何通过服务与房间db进行通信,即跟进问题Insert to room in service not updating LiveData in activity,但是还通过不同的方式解决了这一问题。