1

この質問は、以下からのフォローアップの質問です: 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()ListUseraddChangeListener/removeChangeListenerListUser.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);
      }
   }
}
4

2 に答える 2

1

最初に ListPhoto をクエリします。これは非同期であるため、結果のリスナーを登録する必要があります。次に、そのリスナーで結果を照会して RealmResult を取得できます。

このようなもの

final ListPhoto listPhoto = realm.where(ListPhoto.class).equalTo("id", id).findFirstAsync();
listPhoto.addChangeListener(new RealmChangeListener<RealmModel>() {
    @Override
    public void onChange(RealmModel element) {
        RealmResults<Photo> photos = listPhoto.getList().where().findAll();
        // do stuff with your photo results here.


        // unregister the listener.
        listPhoto.removeChangeListeners();
    }
});

RealmList に対して実際にクエリを実行できることに注意してください。そのため、 を呼び出すことができますlistPhoto.getList().where()where()just は「すべて返す」という意味です。

コードがないため、テストできません。elementwithをキャストする必要がある場合があります((ListPhoto) element)

于 2016-07-06T09:30:31.137 に答える