如何在Firebase Android中查询SQL IN子句?我想在Firebase Recycler适配器中使用它来根据某些条件仅检索一些子项。类似于以下声明:
SQL----> select * from posts where city in(10 cities comes here)
我需要Firebase查询才能在Firebase Recycler适配器中使用它。
答案 0 :(得分:2)
Firebase数据库没有SQL WHERE id IN (1,2,3)
的等效内容。在按ID选择的情况下,Firebase检索项目的方式同样快,因为Firebase pipelines the requests。
您的情况有所不同,因为您没有按ID选择。很遗憾,无法将您的查询直接映射到Firebase数据库中的等效内容。
我强烈建议您开始将数据模型映射到更适合NoSQL数据库的内容,而不是尝试使Firebase的NoSQL数据库做SQL技巧。有关启动此流程的一些重要资源,请参阅NoSQL data modeling上的这篇文章以及Firebase for SQL developers上的新视频系列。
答案 1 :(得分:1)
我找到了解决方案:我们无法使用FirebaseRecyclerAdapter
。相反,我们必须创建扩展RecyclerView.ViewHolder
的自定义适配器。
要将值传递给此适配器,首先我们必须使用addValueEventListener
检索数据,然后我们必须将值传递给适配器。
这是我的代码......
final ArrayList<Timeline> 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) {
}
});
适配器-----&GT;
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Context context;
ArrayList<Timeline> timeline;
public RecyclerAdapter(Context context, ArrayList<Timeline> 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);
}
}
}