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

时间:2016-12-01 12:37:19

标签: java android firebase-realtime-database

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

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

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

2 个答案:

答案 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上的新视频系列。

另见Firebase complex "contain" queries

答案 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);
        }

    }
}