如何在Firebase Android中查询SQL IN子句

如何在Firebase Android中查询SQL IN子句? 我想在Firebase Recycler适配器中使用它来根据某些条件仅检索一些子项。 类似于以下声明:

SQL----> select * from posts where city in(10 cities comes here) 

我需要Firebase查询才能在Firebase Recycler适配器中使用它。

Firebase数据库没有SQL的WHERE id IN (1,2,3) 。 在按ID选择的情况下,Firebase检索项目的方式同样快,因为Firebase会对请求进行管道处理 。

你的情况有所不同,因为你没有按ID选择。 很遗憾,无法将您的查询直接映射到Firebase数据库上的等效内容。

我强烈建议您开始将数据模型映射到更适合NoSQL数据库的东西,而不是尝试使Firebase的NoSQL数据库做SQL技巧。 本篇关于NoSQL数据建模的文章以及我们针对SQL开发人员的Firebase新video系列,可以帮助您启动这一过程。

另请参阅Firebase复杂“包含”查询

我找到了解决方案:我们无法使用FirebaseRecyclerAdapter 。 相反,我们必须创建扩展RecyclerView.ViewHolder自定义适配器。

要将值传递给此适配器,首先我们必须使用addValueEventListener检索数据,然后我们必须将值传递给适配器。

这是我的代码……

 final ArrayList timelines = new ArrayList<>(); mDatabaseTimeline.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { final Timeline timeline = dataSnapshot.getValue(Timeline.class); if(timeline != null){ mDatabaseFriends.child(mAuth.getCurrentUser().getUid()).child("active").addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if (mAuth.getCurrentUser().getUid().equals(timeline.getUid()) || dataSnapshot.hasChild(timeline.getUid())) { timelines.add(timeline); mTimelineRecycler.setAdapter(new RecyclerAdapter(TimelineFragment.this.getContext(), timelines)); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(DatabaseError databaseError) { } }); 

适配器—–>

 public class RecyclerAdapter extends RecyclerView.Adapter { Context context; ArrayList timeline; public RecyclerAdapter(Context context, ArrayList timeline) { this.context = context; this.timeline = timeline; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(context); View row = inflater.inflate(R.layout.timeline_row, parent, false); TimelineViewHolder holder = new TimelineViewHolder(row); return holder; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { final String post_key = timeline.get(position).getPostkey(); ((TimelineViewHolder) holder).setUsername(timeline.get(position).getUsername()); } @Override public int getItemCount() { return timeline.size(); } public class TimelineViewHolder extends RecyclerView.ViewHolder { public TimelineViewHolder(View itemView) { super(itemView); view = itemView; } public View getView() { return view; } public void setUsername(String username) { TextView usernameTxtView = (TextView) view.findViewById(R.id.timeline_username); usernameTxtView.setText(username); } } }