我正在尝试对通过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无法读取存储库中的新对象吗?
如果需要更多代码来理解该问题,只需询问。完全为此感到困惑。
答案 0 :(得分:0)
简单地说,是的,可以。 LiveData没有更新,不是Transformations.switchMap()的问题。仍然无法弄清楚如何通过服务与房间db进行通信,即跟进问题Insert to room in service not updating LiveData in activity,但是还通过不同的方式解决了这一问题。