这是我的用户集合的外观。我正在尝试获取与 +911234567890 匹配的孩子,这是我的相同代码:
mDatabase.child(Commons.DB_USER).orderByChild(Commons.CHILD_CONTACT).equalTo('+911234567890').addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
UserModel user = snapshot.getValue(UserModel.class);
Utils.debug("Children onDataChange " + snapshot.getChildrenCount() + " " + user.getName() + " " + snapshot.getKey());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
我希望我将在快照中获得与我传递的键匹配的Usermodel。但是,在Usermodel中访问名称将提供null,snapshot.getKey()返回用户
如何在 +911234567890 键下找到对象?
答案 0 :(得分:2)
对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。
您的onDataChange
需要通过遍历snapshot.getChildren()
来处理此列表。所以:
mDatabase.child(Commons.DB_USER).orderByChild(Commons.CHILD_CONTACT).equalTo('+911234567890').addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot userSnapshot: snapshot.getChildren()) {
UserModel user = userSnapshot.getValue(UserModel.class);
Utils.debug("Children onDataChange " + snapshot.getChildrenCount() + " " + user.getName() + " " + userSnapshot.getKey());
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
throw error.toException(); // don't ignore errors
}
});
答案 1 :(得分:1)
即使我找到了弗兰克答案的解决方案,我还是尝试了几种方法,最终得到了这个结果:
List<Object>
这是什么,当条件匹配并且您期望得到完全相同的结果时,您可以直接将其用作访问内部子对象/对象的路径,而无需编写for循环。
max_val = max(max(dict_A.values()), max(dict_B.values())) + 1
keys = set(list(dict_A.keys()) + list(dict_B.keys()))
dict_C = { key : min(dict_A.get(key, max_val), dict_B.get(key, max_val)) for key in keys }