getKey()返回值而不是ID

时间:2016-12-28 10:07:34

标签: android firebase firebase-realtime-database

我试图获取Firebase数据库中特定孩子的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。

我在这里做错了什么?

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

JSON:

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

1 个答案:

答案 0 :(得分:2)

建议您阅读本文Best Practices: Arrays in Firebase

  

数组非常方便。但对于分布式数据,它们并不可靠,因为它们缺乏访问每条记录的独特,永久的方式。

这意味着您无法在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 node
  • 然后,当点击列表视图中的视图时,将用户名作为intent extra发送到其他活动intent.putExtra("username", username);
  • 最后,在新活动中,收听Users_details/<username_from_intent>以获取用户详细信息(电话号码,地址等)

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