我试图获取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" ]
}
答案 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.putExtra("username", username);
Users_details/<username_from_intent>
以获取用户详细信息(电话号码,地址等)希望这有帮助,这种结构肯定比保存数组中的每个细节更好。如果您阅读了我提供的第一个链接,则应避免这种做法,因为您可能会更改用户详细信息。