0

私は以下のようなデータ構造を持っています。このようなFirebaseRecyclerAdapterのクエリが必要です。Android用Firebaseの複雑なクエリ

Query query = dbPosts.orderByChild("createDate").orderByChild("status").equlTo(0).orderByChild("voteSum").biggerThan(20); 

は、私は特定の状況で、その後の並べ替え、最初の作成日でソートし、最終的には、特定の状況に従う人々を持って帰りたいと思います。

仕様などはわかりませんが、私はそれが何を意味するのか分かります。だから、私はどのようにこのクエリのようにすることができますか、それとも他の方法でそれを行うことができます RecyclerViewへの私の願いを示す。

ps:貧しい私の英語のために申し訳ありません。

データ構造

"posts" : { 
"-K_FaI8rsasB0hvFNTTv" : { 
    "category" : 0, -> int 
    "createdDate" : 1483115934775, 
    "image" : "https://firebasestorage.googleapis.com/...", 
    "status" : 0, -> int 
    "title" : "sadfsadfsadf", 
    "userId" : "iuHJQ044GrMPjRMF1CxPq15tp6g2", 
    "username" : "someone", 
    "voteSum" : 34 -> Long 
}, 
"-K_GI57zSiPP6ETgctPD" : { 
    "category" : 0, -> int 
    "createdDate" : 1483127677924, 
    "image" : "https://firebasestorage.googleapis.com/...", 
    "status" : 0, ->int 
    "title" : "qwewqeqwe", 
    "userId" : "MWv568D0f3VO1y683kZumOQ7gHZ2", 
    "username" : "idiots", 
    "voteSum" : 13 -> Long 
} 

} 

FirebaseRecyclerAdapter:Query based on multiple where clauses in firebase

public FirebaseRecyclerAdapter recyclerAdapter(Query query) { 

    FirebaseRecyclerAdapter<Post, PostViewHolder> firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Post, PostViewHolder>(
      Post.class, 
      R.layout.card_view_post, 
      PostViewHolder.class, 
      query 
    ) { 
     @Override 
     protected void populateViewHolder(final PostViewHolder viewHolder, Post model, int position) { 

      final String postId = getRef(position).getKey(); 
      // TODO sum vote 
      viewHolder.setTitle(model.getTitle()); 
      viewHolder.setImage(getContext(), model.getImage()); 
      viewHolder.setSumVotes(postId); 
      viewHolder.setSumComments(postId); 
      if (checkAuthUser()) { 
       viewHolder.setUpVote(postId); 
       viewHolder.setDownVote(postId); 
      } 

      viewHolder.txtTitle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(getActivity(), SinglePostActivity.class); 
        intent.putExtra(Enums.PostKeys.postId.getValue(), postId); 
        startActivity(intent); 
       } 
      }); 

      viewHolder.imvImage.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(getActivity(), SinglePostActivity.class); 
        intent.putExtra(Enums.PostKeys.postId.getValue(), postId); 
        startActivity(intent); 
       } 
      }); 

      viewHolder.imbComment.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        Intent intent = new Intent(getActivity(), CommentsActivity.class); 
        intent.putExtra(Enums.PostKeys.postId.getValue(), postId); 
        startActivity(intent); 
       } 
      }); 


      viewHolder.imbUpVote.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        if (!checkAuthUser()) { 
         startActivity(new Intent(getActivity(), SignUpActivity.class)); 
         return; 
        } 
        processVote = true; 

        Singleton.getDbPostDownVote().child(postId).addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if (processVote == true) { 
           if (dataSnapshot.hasChild(getUserId())) { 
            Singleton.getDbPostDownVote().child(postId).child(getUserId()).removeValue(); 
           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

        Singleton.getDbPostUpVote().child(postId).addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 


          if (processVote == true) { 
           if (dataSnapshot.hasChild(getUserId())) { 
            Singleton.getDbPostUpVote().child(postId).child(getUserId()).removeValue(); 
            processVote = false; 
           } else { 
            Singleton.getDbPostUpVote().child(postId).child(getUserId()).setValue(0); 
            processVote = false; 
           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

       } 
      }); 

      viewHolder.imbDownVote.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 

        if (!checkAuthUser()) { 
         startActivity(new Intent(getActivity(), SignUpActivity.class)); 
         return; 
        } 

        processVote = true; 

        Singleton.getDbPostUpVote().child(postId).addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 
          if (processVote == true) { 
           if (dataSnapshot.hasChild(getUserId())) { 
            Singleton.getDbPostUpVote().child(postId).child(getUserId()).removeValue(); 
           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

        Singleton.getDbPostDownVote().child(postId).addValueEventListener(new ValueEventListener() { 
         @Override 
         public void onDataChange(DataSnapshot dataSnapshot) { 

          if (processVote == true) { 

           if (dataSnapshot.hasChild(getUserId())) { 
            Singleton.getDbPostDownVote().child(postId).child(getUserId()).removeValue(); 
            processVote = false; 
           } else { 
            Singleton.getDbPostDownVote().child(postId).child(getUserId()).setValue(1); 
            processVote = false; 
           } 
          } 
         } 

         @Override 
         public void onCancelled(DatabaseError databaseError) { 

         } 
        }); 

       } 
      }); 


      viewHolder.imbMenu.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Context context = new ContextThemeWrapper(getContext(), R.style.popupMenuStyle); 
        PopupMenu popup = new PopupMenu(context, viewHolder.imbMenu); 
        //inflating menu from xml resource 
        popup.inflate(R.menu.post_menu); 
        //adding click listener 
        popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
         @Override 
         public boolean onMenuItemClick(MenuItem item) { 
          switch (item.getItemId()) { 
           case R.id.deletePost: 
            break; 
           case R.id.reportPost: 

            break; 
          } 
          return false; 
         } 
        }); 
        //displaying the popup 
        popup.show(); 
       } 
      }); 

     } 


    }; 

    return firebaseRecyclerAdapter; 
} 

答えて

2

まず、同じトピックに関する私の以前の回答をお読みください。

あなたはそのバリエーションがあります。 1つのプロパティにstatusvoteSumの値を組み合わせて、createdDateのソートクライアント側を実行できます。以来、あなたはまだ、再オーダーへの道にcreatedDateクライアント側の項目を見つける必要があります

ref.orderByChild("status_voteSum").startAt("0_21")... 

"posts" : { 
    "-K_FaI8rsasB0hvFNTTv" : { 
     "status_voteSum": "0_34", 
     "category" : 0, 
     "createdDate" : 1483115934775, 
     "image" : "https://firebasestorage.googleapis.com/...", 
     "status" : 0, 
     "title" : "sadfsadfsadf", 
     "userId" : "iuHJQ044GrMPjRMF1CxPq15tp6g2", 
     "username" : "someone", 
     "voteSum" : 34 
    }, 
    "-K_GI57zSiPP6ETgctPD" : { 
     "status_voteSum": "0_13", 
     "category" : 0, 
     "createdDate" : 1483127677924, 
     "image" : "https://firebasestorage.googleapis.com/...", 
     "status" : 0, 
     "title" : "qwewqeqwe", 
     "userId" : "MWv568D0f3VO1y683kZumOQ7gHZ2", 
     "username" : "idiots", 
     "voteSum" : 13 
    } 
} 

今、あなたがstatus=0voteSum>20ですべての項目を照会することができますアプローチは、1つのリレーション操作(最後の値)に対してのみ使用できます。

私がリンクした回答に加えて、このアプローチはビデオシリーズFirebase for SQL developersのエピソードの1つでもカバーされています。