【问题标题】:Retrieving Data From Firebase database using android efficiently有效地使用 android 从 Firebase 数据库中检索数据
【发布时间】:2018-04-17 11:59:57
【问题描述】:

我有以下 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) {

                        }
                    });

我试图将用户下的孩子设置为电子邮件,但火力基地不允许我在密钥中使用一些特殊字符。任何使代码更高效的建议将不胜感激。或者任何可以使查询更容易的关键建议都会很棒。

提前致谢

【问题讨论】:

  • 你可以想一想 1) sign uplogin 基于电子邮件和密码,已经 firebase 提供了这个功能,这对你来说会容易得多!
  • 好吧,如果您真的想将电子邮件 ID 作为键,绕过特殊字符的一种简单方法是对字符进行编码,例如 html 如何将 '
  • @kdblue 我正在这样做,但我想添加其他信息,例如年龄、生物兴趣...
  • @KaranModi 我想这会造成麻烦,但谢谢!
  • @CharbelHanna 是的,你可以! ,这是一个很好的方法!

标签: android firebase firebase-realtime-database


【解决方案1】:

您可以添加从火力基地接收的user's id,而不是放置随机值或自动生成的密钥

firebaseAuth.getCurrentUser().getUid()

这将更容易访问并且效率更高,因为每当您登录时,您将拥有此user_id 并对应于user_id,您可以收到电子邮件而不是检查数据库中的所有值

【讨论】:

  • 看到答案的时间戳可能是因为这个答案看起来已经发布在另一个答案中。
【解决方案2】:

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

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 下添加用户 ID 而不是 push() 然后检索用户 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) {

                }
            });

这样你就不必循环了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-21
    • 2021-01-08
    • 2020-07-22
    • 1970-01-01
    相关资源
    最近更新 更多