【问题标题】:Firebase querying data having childs as uidFirebase查询具有孩子作为uid的数据
【发布时间】:2017-06-22 11:18:43
【问题描述】:

Users 是我的根节点,因为我通过获取经过身份验证的用户的uid 创建了各种子节点。在这些孩子 (uid) 中,他们有各种各样的孩子,例如信息、一般维护、投诉。

我想展示一些来自所有用户 (uids) 的常规维护孩子的详细信息,例如 gCitygProductModel。每个 uid 将具有不同的值 gCity 等。在常规维护下,我想通过在适配器和 listview 上设置来检索所有数据。

我无法找回它。

数据库图片

获取代码

当我尝试使用'getuid()'(如下所示)从当前用户检索数据时,它工作正常。但是,当我尝试使用“getkey()”检索所有用户数据时,它不起作用。

user = FirebaseAuth.getInstance().getCurrentUser();
ref= FirebaseDatabase.getInstance().getReference("Users")
.child(user.getUid())
.child("General Maintenance");

ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(list_users.size() > 0)
                list_users.clear();

            for(DataSnapshot postSnapshot:dataSnapshot.getChildren())
                {
                Generalperson user = 
                 postSnapshot.getValue(Generalperson.class);
                list_users.add(user);
            }
                if(list_users.size() != 0)
                { ListViewAdapter adapter = new 
            ListViewAdapter(ServicehistoryActivity.this, list_users);
                list_data.setAdapter(adapter);}
            else
                {
                    list_data.setVisibility(View.INVISIBLE);
                    k.setVisibility(View.VISIBLE);
                }


        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

【问题讨论】:

  • 您在问题中包含了您的代码和 JSON 树的图片。请将其替换为实际代码和 JSON 作为文本。您可以通过单击your Firebase Database console 中的导出 JSON 链接轻松获得后者。将代码和 JSON 作为文本使其可搜索,使我们能够轻松地使用它来测试您的实际数据并在我们的答案中使用它,通常只是一件好事。

标签: android firebase firebase-realtime-database


【解决方案1】:

请使用此代码:

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference().child("Users");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userId = ds.getKey();

            DatabaseReference userIdRef = FirebaseDatabase.getInstance().getReference().child("Users").child(userId);
            ValueEventListener valueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot ds : dataSnapshot.child("General Maintenence").getChildren()) {
                        String gCity = ds.child("gCity").getValue(String.class);
                        String gEmail = ds.child("gEmail").getValue(String.class);
                        String gPhone = ds.child("gPhone").getValue(String.class);
                        //and so on
                    }           
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {}
            };
            userIdRef.addListenerForSingleValueEvent(valueEventListener);
        }

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
usersRef.addListenerForSingleValueEvent(eventListener);

如果您收到此错误,Listen at /Users failed: DatabaseError: Permission denied 是因为您未获得数据库授权,请检查实时数据库中的“规则”选项卡并进行此更改:

{
  "rules": {
    ".read": true,
    ".write":true
  }
}

希望对你有帮助。

【讨论】:

  • 使用 getUid() 会显示当前使用它的人的详细信息,对吗?我的问题是我想从所有用户的一般维护孩子那里检索 gCity、gEmail。
  • 是的,没错。从身份验证中获得uid,您可以在DatabaseReference 中使用它。
  • 但我的问题是我想从“所有”用户的一般维护子项中检索 gCity、gEmail 并通过在列表视图上设置适配器同时显示它们
  • 请查看我的更新答案以获取所有用户的数据。
  • getKey() 仅提供引用指向的位置中的最后一个令牌,所以我将如何获取整个用户密钥。
猜你喜欢
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2018-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
相关资源
最近更新 更多