使用android有效地从Firebase数据库中检索数据

时间:2018-04-17 11:59:57

标签: android firebase firebase-realtime-database

我有以下的Firebase数据库:

  • 根节点
  • 用户节点
  • 由ref.push()
  • 生成的自动生成的密钥
  • 属性

我试图只检索用户下单个孩子的一个属性。这是我的数据库的屏幕截图:

Screenshot of my database

如果你检查屏幕截图,我只想检索电子邮件(假设我没有其他方式获取它)。但是,在代码中,我不会知道包含我想要的电子邮件的User的孩子。这是我目前正在做的但效率很低(这段代码检查我当前的用户是否存在,如果没有,它会将他/她的数据添加到数据库中):

FirebaseDatabase database = FirebaseDatabase.getInstance();
                    DatabaseReference ref = database.getReference("User");

                    ref.addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            Iterable<DataSnapshot> children = dataSnapshot.getChildren();
                            for (DataSnapshot child:children) {
                                User user1 = child.getValue(User.class);
                                Log.d("kharas email",user1.getEmail()+"");
                                if(!user1.getEmail().equals(firebaseAuth.getCurrentUser().getEmail())){

                                    GraphRequest.newMeRequest(token, new GraphRequest.GraphJSONObjectCallback() {
                                        String birthday = "Not Available";
                                        @Override
                                        public void onCompleted(JSONObject object, GraphResponse response) {
                                            User userInfo = new User();
                                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                                            DatabaseReference ref = database.getReference("User");
                                            birthday = object.has("email")+"";
                                            userInfo.setBirthday(birthday);
                                            userInfo.setEmail(firebaseAuth.getCurrentUser().getEmail());

                                            ref.push().setValue(userInfo);
                                        }
                                    }).executeAsync();

                                }
                            }
                        }

                        @Override
                        public void onCancelled(DatabaseError databaseError) {

                        }
                    });

我尝试将User下的子项设置为电子邮件,但firebase不允许我在键中使用一些特殊字符。任何使代码更有效的建议都将受到赞赏。或者任何可以使查询更容易的关键建议都会很棒。

提前致谢

2 个答案:

答案 0 :(得分:1)

您可以添加从火灾基地收到的E,而不是放置随机值或自动生成的密钥

([^=\"]*[^=\s])

这将更容易访问并且效率更高,因为无论何时您将登录,您将拥有此user's id并且对应于firebaseAuth.getCurrentUser().getUid() 您可以收到电子邮件而不是检查所有值数据库

答案 1 :(得分:0)

如果您不知道随机密钥,检索电子邮件的唯一方法是:

FirebaseDatabase database = FirebaseDatabase.getInstance();
                DatabaseReference ref = database.getReference("User");

                ref.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                   public void onDataChange(DataSnapshot dataSnapshot) {
                       for(DataSnapshot datas: dataSnapshot.getChildren()){                            for (DataSnapshot child:children) {
                            String email=datas.child("email").getValue().toString();
                   } 
                }
                     @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

或者您可以使用firebase身份验证并在Users而不是push()下添加用户ID,然后检索用户ID:

FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
String userid=user.getUid();
FirebaseDatabase database = FirebaseDatabase.getInstance();
            DatabaseReference ref = database.getReference("User");

            ref.child(userid).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
               public void onDataChange(DataSnapshot dataSnapshot) {
                 String email=dataSnapshot.child("email").getValue().toString();
               } 
            }
                 @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

这样你就不必循环了。