这个问题是一个后续问题:Organize Android Realm data in lists
由于我们使用的 API 返回的数据,稍微不可能对领域数据库进行实际查询。相反,我将订购的数据包装在 a 中RealmList
并添加 a @PrimaryKey public String id;
。
所以我们的领域数据看起来像:
public class ListPhoto extends RealmObject {
@PrimaryKey public String id;
public RealmList<Photo> list; // Photo contains String/int/boolean
}
只需将 API 端点用作id
.
所以一个典型的查询看起来像:
realm.where(ListPhoto.class).equalTo("id", id).findFirstAsync();
这会产生一点listening/subscribing
数据开销,因为现在我需要检查适配器上的实际数据的使用情况listUser.isLoaded()
。ListUser
addChangeListener/removeChangeListener
ListUser.list
所以我的问题是:
有没有办法可以查询这个领域来接收RealmResults<Photo>
. 这样我就可以轻松地使用这些数据RealmRecyclerViewAdapter
并直接在其上使用侦听器。
编辑:为了进一步澄清,我想要以下内容(我知道这不会编译,它只是我想要实现的伪代码)。
realm
.where(ListPhoto.class)
.equalTo("id", id)
.findFirstAsync() // get a results of that photo list
.where(Photo.class)
.getField("list")
.findAllAsync(); // get the field "list" into a `RealmResults<Photo>`
编辑最终代码:考虑到 ATM 不可能直接在查询中执行此操作,我的最终解决方案是简单地使用一个适配器来检查数据并在需要时进行订阅。下面的代码:
public abstract class RealmAdapter
<T extends RealmModel,
VH extends RecyclerView.ViewHolder>
extends RealmRecyclerViewAdapter<T, VH>
implements RealmChangeListener<RealmModel> {
public RealmAdapter(Context context, OrderedRealmCollection data, RealmObject realmObject) {
super(context, data, true);
if (data == null) {
realmObject.addChangeListener(this);
}
}
@Override public void onChange(RealmModel element) {
RealmList list = null;
try {
// accessing the `getter` from the generated class
// because it can be list of Photo, User, Album, Comment, etc
// but the field name will always be `list` so the generated will always be realmGet$list
list = (RealmList) element.getClass().getMethod("realmGet$list").invoke(element);
} catch (Exception e) {
e.printStackTrace();
}
if (list != null) {
((RealmObject) element).removeChangeListener(this);
updateData(list);
}
}
}