我正在尝试实现对通过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如何无法读取存储库中的新对象?
如果需要更多的代码来理解问题,只需问一问。我完全被这件事弄糊涂了。
发布于 2019-08-15 15:46:47
简单地说,你可以。Transformations.switchMap()不是LiveData不更新的问题。还不知道如何从服务中与数据库通信(跟进问题Insert to room in service not updating LiveData in activity ),还可以通过不同的方式解决这一点。
https://stackoverflow.com/questions/57465151
复制相似问题