【发布时间】:2018-04-04 14:54:42
【问题描述】:
我正在试用 Realm 以及包括 LiveData 在内的 Android 架构组件。
我一直在遵循 Google 的应用程序架构指南:
https://developer.android.com/topic/libraries/architecture/guide.html
...用 Realm 代替 Room。
我的一切都在使用:
LiveData<RealmResults<CustomModelObject>>
从我的存储库层直接通过 ViewModel 到 View。
我认为从存储库返回更多泛型类型可能会更好,所以LiveData<List<CustomModelObject>> 而不是LiveData<RealmResults<CustomModelObject>>。
这是我卡住的代码sn-p:
@NonNull
@Override
protected LiveData<List<CustomModelObject>> loadFromDb() {
return Transformations.switchMap(customModelObjectsDao.getCustomModelObjects(),
new Function<RealmResults<CustomModelObject>, LiveData<List<CustomModelObject>>>() {
@Override
public LiveData<List<CustomModelObject>> apply(RealmResults<CustomModelObject> data) {
if (data == null) {
return AbsentLiveData.create();
} else {
return customModelObjectsDao.getCustomModelObjects();
}
}
});
}
customModelObjectsDao.getCustomModelObjects() 当前返回LiveData<RealmResults<Inspiration>>。
我想把它转换成LiveData<List<Inspiration>>。
我尝试了各种Transformations.map 和Transformations.switchMap 等都没有成功,我想我已经盯着它太久了:)
我是在正确的道路上还是我错过了一些明显的东西?
非常感谢任何帮助。
谢谢, 保罗。
更新
道:
public RealmLiveData<CustomModelObject> getCustomModelObjects() {
return asLiveData(realm.where(CustomModelObject.class).findAllAsync());
}
asLiveData 实现:
fun <T: RealmModel> RealmResults<T>.asLiveData() = RealmLiveData<T>(this)
fun Realm.CustomModelObjectsDao(): CustomModelObjectsDao = CustomModelObjectsDao(this)
更新 2
public class RealmLiveData<T> extends LiveData<RealmResults<T>> {
private RealmResults<T> results;
private final RealmChangeListener<RealmResults<T>> listener = new RealmChangeListener<RealmResults<T>>() {
@Override
public void onChange(RealmResults<T> results) {
setValue(results);
}
};
public RealmLiveData(RealmResults<T> realmResults) {
results = realmResults;
}
@Override
protected void onActive() {
results.addChangeListener(listener);
}
@Override
protected void onInactive() {
results.removeChangeListener(listener);
}
}
【问题讨论】:
-
我需要知道你的 DAO 如何回答这个问题 (
customModelObjectsDao.getCustomModelObjects()) -
嗨 Epic,我已经更新了这个问题。谢谢,保罗。
-
Welp,现在我需要询问
RealmLiveData是否是自定义的,还是from therealm-examples:D 但我认为您还需要在问题中添加RealmLIveData以使其完整 -
哈!我认为这即将到来:) 它几乎与更少的错误处理相同。谢谢,保罗。
标签: android realm android-livedata