【发布时间】:2019-08-12 16:46:46
【问题描述】:
我正在尝试实现对通过 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 永远不会更新,或显示非空值。
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 无法读取存储库中的新对象吗?
如果需要更多代码来理解问题,请询问。我完全被这件事难住了。
【问题讨论】:
-
您必须观察
LiveData才能获得回调。你在哪里观察mLatestData? -
更新了问题以显示我如何附加观察者,可以确认 livedata[] 持有 livedata,并且观察者已附加,但它们始终返回 null。
-
我开始认为将内部查询放入 where 子句会导致 livedata 不更新。明天去试试inner join。
-
在此处查看更新的问题:stackoverflow.com/questions/57495102/…
标签: java android android-room