2017-02-26 2 views
3

フォーラムの種類のアプリを開発しています。ユーザーは質問を投稿し、関連技術にタグを付けることができます。parseSnapshot(DataSnapshotスナップショット)を使用して子キーに基づいてRecyclerViewにアイテムをフィルタリングする

アプリにはFirebase database repoと似たモジュールとデータベースがあります。

私はそのタグに従って投稿をフィルタリングしたかったのです。サーバー側でのフィルタリングは複数のキー値では不可能なので、私はRecyclerViewに移入する前にそれをフィルタリングする方法にアプローチしなければなりませんでした。

私はここの質問の多くを言及し、この場合のPUFのanswerが関連を発見しました。

これは私が今ちょうど一つの値をしようと、次のロジック

@Override 
    protected Post parseSnapshot(DataSnapshot snapshot) { 
     if (snapshot.getValue(Post.class).tag.equals("#HTML")){ 
      Log.d(TAG,"gotHTML Filtered Posts"); 
      return snapshot.getValue(Post.class); 
     } 
     else 
     return super.parseSnapshot(snapshot); 
    } 

とparseSnapshotをオーバーライドしています私のJSONツリー

"posts" : { 
"-Kdb0BsybfpPtkAPRF1-" : { 
    "author" : "Anush Surendran", 
    "body" : "Test 1 ", 
    "commentCount" : 0, 
    "created" : 1487787053303, 
    "starCount" : 1, 
    "stars" : { 
    "v9KTwyI2DMbDgKHALgPSJEBK3fi1" : true 
    }, 
    "tag" : "#CSS", 
    "title" : "Checking Post Time", 
    "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1" 
}, 
"-Kdb2D9vD-3kHWpCMIFi" : { 
    "author" : "Anush Surendran", 
    "body" : "Abc", 
    "commentCount" : 0, 
    "created" : 1485000000000, 
    "starCount" : 0, 
    "tag" : "#HTML", 
    "title" : "Test 2", 
    "uid" : "BvNgX2U5U4SriTWsoEtqbGYgOTw1" 
} 

です。複数のタグ(HTML、CSS、JSなど)をフィルタリングするためにこれをループに入れます。

コードが正常に動作し、if条件が期待どおりに機能することがわかりました。

私は特定のタグとは柱がない場合、他の部分に戻るために何を見つけ出すことができませんでした。現在のelse部分はすべての投稿を返します。

これに比べてデータをフィルタリングする良い方法はありますか?

ご協力いただければ幸いです!

答えて

1

は、スナップショット内のデータのサブセットにビューをマッピングするために使用することができます。データをフィルタリングするためにifを使用することはできません。

現在、FirebaseUIを使用してクライアント上のデータをフィルタリングする方法はありません。オープン機能要求があります:https://github.com/firebase/FirebaseUI-Android/issues/15。あなたがその問題で見ることができるように、それは論争の的な特徴です。 Morgan says thereとして

:私たちは貪欲に表示されない場合があり、データを引っ張って奨励したくないので、

[FirebaseUI]、意図的な非目標としてフィルタリングしています。

あなたのシナリオでは、あまりにも多くのデータを取得することは間違いありません。必要なフィルタリングをサーバー上で実行できるようにするデータモデルを考え出すほうがずっと良いでしょう。

+1

本当にありがとうございます!私は機能の要求にも従いました。このための回避策はありますか?私は1つのキー(データベースのタグ)に基づいてフィルタリングしたいからです。私はこの場合に役立つモデルを考えることができませんでした。 –

+0

共有したJSONスニペットで、 'FirebaseDatabase.getInstance()。ref(" posts ")。orderByChild(" Tag ")。equalTo("#HTML ")'を単に照会することができます。しかし、各アイテムが複数のタグを持つことができる場合は、http://stackoverflow.com/questions/40656589/firebase-query-if-child-of-child-contains-a-value –

3

すべてのデータを取り出してクライアントでフィルタリングする代わりに、ファイアベースからフィルタリングされたデータを取得できます。オーバーライドparseSnapshot

DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
Query postsQuery = mDatabase.child("posts").orderByChild("tag").equalTo("#HTML"); 
mAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(Post.class, R.layout.item_post, PostViewHolder.class, postsQuery) { 
      @Override 
      protected void populateViewHolder(final PostViewHolder viewHolder, final Post model, final int position) { 
       final DatabaseReference yourRef = getRef(position); 
       viewHolder.bindToPost(model,getContext()); 

      } 
     }; 
     mRecycler.setAdapter(mAdapter); 
+1

助けてくれてありがとう!私はこのようにそれを取得することを知っています。しかし、これは1つの値に対してのみ機能し、前述した複数の値には当てはまりません。だから、唯一の方法はそれを解析することです。 –

関連する問題