如何在Firebase数据库中使用多个orederbychild?

时间:2017-05-02 08:24:51

标签: android firebase firebase-realtime-database

Hello Everyone我在我的应用中使用firebase数据库。我能够将数据添加到数据库。现在我想在我的应用程序中实现搜索,我有两个搜索用户选项,

1)血型
2)用户区

我可以根据血型选择获取数据,但我不知道如何获取血型和区域的数据。 (多选过滤器)

现在,如果用户选择' A +'作为来自旋转器的血型并选择Area' ABC' 然后,结果将来自用户' A +'血型和' ABC'区域。

search_button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


                System.out.println("Default Selected"+sel_blood_group);



                mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        //Your Logic here
                        for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                            UserRegisterModel mModel = eventSnapshot.getValue(UserRegisterModel.class);
                           // Log.e("DATA" ,""+ mModel.getName());
                        }


                        Query chatRoomsQuery = mFirebaseDatabase.orderByChild("blood_group").equalTo(sel_blood_group);

                        chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()) {
                                    // dataSnapshot is the "issue" node with all children with id 0
                                    for (DataSnapshot issue : dataSnapshot.getChildren()) {
                                        // do something with the individual "issues"
                                        UserRegisterModel mModel = issue.getValue(UserRegisterModel.class);
                                        Log.e("QUERY DATA" ,""+ mModel.getName());
                                    }
                                }
                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });
                        Log.e("DATA" ,""+ chatRoomsQuery.toString());
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });

2 个答案:

答案 0 :(得分:1)

Firebase RealTime数据库不支持多个where子句。因此,尝试使用一个过滤器进行查询,然后以编程方式过滤下一个过滤器。

search_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            System.out.println("Default Selected"+sel_blood_group);
            System.out.println("Default Selected"+sel_area);


            mFirebaseDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    //Your Logic here
                    for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {
                        UserRegisterModel mModel = eventSnapshot.getValue(UserRegisterModel.class);
                       // Log.e("DATA" ,""+ mModel.getName());
                    }


                    Query chatRoomsQuery = mFirebaseDatabase.orderByChild("blood_group").equalTo(sel_blood_group);

                    chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            if (dataSnapshot.exists()) {
                                // dataSnapshot is the "issue" node with all children with id 0
                                for (DataSnapshot issue : dataSnapshot.getChildren()) {
                                    // do something with the individual "issues"
                                    UserRegisterModel mModel = issue.getValue(UserRegisterModel.class);
                                   if(mModel.getArea().equals(sel_area))
                                    Log.e("QUERY DATA" ,""+ mModel.getName());
                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });
                    Log.e("DATA" ,""+ chatRoomsQuery.toString());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    });enter code here

答案 1 :(得分:0)

您可以使用以下方法仅将userName添加一次。我假设您将用户详细信息存储在UserRegisterModel类中。请关注DatabaseReferences,因为我已经使用了你提到的内容而且我不知道你的数据库结构。

Query chatRoomsQuery = mFirebaseDatabase.orderByChild("User_Name").equalTo(userRegisterModel.getUserName());

                chatRoomsQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                                Log.e("UserAlready Registered");
                            }
                            else
                            {
                            mFirebaseDatabase.push().setValue(userRegisterModel);;
            Log.i("User added Successfully");
                            }
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

我没有测试过代码,但我认为它会起作用! :)