【问题标题】:How to use multiple orederbychild in Firebase database?如何在 Firebase 数据库中使用多个 orederbychild?
【发布时间】:2017-09-29 16:58:50
【问题描述】:

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

1)血型
2)用户区

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

现在如果用户从微调器中选择“A+”作为血型并选择区域“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) {

                    }
                });
            }
        });

【问题讨论】:

标签: android firebase firebase-realtime-database


【解决方案1】:

Firebase 实时数据库不支持多个 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

【讨论】:

【解决方案2】:

您可以使用以下方法使用户名仅添加一次。我假设您将用户详细信息存储在 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) {

                    }
                });

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 2017-04-13
    • 2019-12-10
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多