android - getKey() 返回值而不是 ID

标签 android firebase firebase-realtime-database

我正在尝试获取 Firebase 数据库中特定 child 的 ID。 数据库看起来像这样:

Users:

 - id: user1
 - id: user2
 - ...

现在我想返回每个用户的ID,我用这个试过了;

DatabaseReference databaseRef = FirebaseDatabase.getInstance().getReference();
        ValueEventListener users = databaseRef.child("Users").child(bundle.getString("User")).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String userID = dataSnapshot.getKey();


                mTextView.setText(userID);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                //error
            }
        });

bundle.getString("User") 是一个字符串,其中包含我想从中获取 ID 的用户的值。

当我打开应用程序时,mTextView 中的文本只包含用户名而不是 ID。

我做错了什么?

该应用程序是包含所有用户的主 Activity 中的 ListView。当用户单击列表项时,将打开一个新 Activity 。在此 Activity 中,我想显示所选用户的信息,但为此我想获取 ID 以在数据库中找到具有相同 ID 的相应信息。

JSON:

{
  "Users" : [ null, "Jef", "Peter", "Jean", "Ronny" ]
}

最佳答案

本文推荐您阅读Best Practices: Arrays in Firebase

arrays are quite handy. But for distributed data, they aren't reliable because they lack a unique, permanent way to access each record.

这意味着您无法检索Users 下的数组的每个索引。 .您可以先检索整个数组 ( databaseRef.child("Users").addValueEventListener() ),将返回的 dataSnapshot 转换为数组,然后手动检查值或使用 contains方法。

我的建议是将您的数据库结构更改为这样

{
    "Users" : {
        "Jef" : true,
        "Peter" : true,
        "Jean" : true,
        "Ronny" : true
    }
}

有了这个数据库结构,您不需要更改代码,因为它应该已经可以工作了。

编辑:对于您的情况,您可以将其他用户详细信息保存在数据库的其他节点中

{
    "Users" : {
        "Jef" : true,
        "Peter" : true,
        "Jean" : true,
        "Ronny" : true
    },
    "Users_details" : {
        "Jef" : {
            "city" : "some_city_name",
            "address" : "some_address_name",
            "phone_number" : "some_phone_number"
        },
        "Peter" : {
            "city" : "some_city_name",
            "address" : "some_address_name",
            "phone_number" : "some_phone_number"
        },
        "Jean" : {
            ...
        },
        ...
    }
}
  • 要获取用户名列表,您只需要收听Users即可。节点
  • 然后,当单击 ListView 中的 View 时,将用户名作为额外的 Intent 发送到其他 Activity intent.putExtra("username", username);
  • 最后,在新 Activity 中,收听 Users_details/<username_from_intent>获取用户详细信息(电话号码、地址等)

希望这对您有所帮助,这种结构绝对比将每个细节都保存在一个数组中要好。如果您阅读了我提供的第一个链接,则应避免这种做法,因为您可能会更改用户详细信息。

关于android - getKey() 返回值而不是 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41359702/

相关文章:

node.js - Firebase Cloud Functions 直接删除 Node ,而不是 24 小时后

android - 我们可以固定所选标签的位置吗?

android - 在我的 android 应用程序上,即使我从数据库中获得真实值(value),我也无法登录

firebase - Verax 在 Firebase 安全规则中意味着什么?

javascript - 获取从 firebase firestore 返回的文档中的特定字段

PHP 如何在 Firebase 的表中添加/插入表

java - 自动授予 ACTION_MANAGE_OVERLAY_PERMISSION

java类只有声明没有定义

javascript - Firebase 获取特定键的所有值

javascript - 如何使用javascript从firebase中的嵌套数据库中检索所有子项