この質問は、以下からのフォローアップの質問です: Organize Android Realm data in lists
使用する API によって返されるデータが原因で、レルム データベースに対して実際のクエリを実行することは少し不可能です。代わりに、注文したデータを でラップし、RealmList
それに を追加し@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();
これにより、 to data のわずかなオーバーヘッドが発生します。これは、アダプターの実際のデータとしての使用を確認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);
}
}
}