gpt4 book ai didi

java - 是否可以将 Transformations.switchMap 放入存储库中?

转载 作者:行者123 更新时间:2023-12-02 01:45:02 26 4
gpt4 key购买 nike

我正在尝试实现对通过 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;
}

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

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

最佳答案

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

关于java - 是否可以将 Transformations.switchMap 放入存储库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57465151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com