Firebase实时数据库-orderByChild()。equalsTo()在快照中返回父键,而不是值匹配的

时间:2020-07-06 19:34:17

标签: android firebase firebase-realtime-database

Users Collection

这是我的用户集合的外观。我正在尝试获取与 +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 键下找到对象?

2 个答案:

答案 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 }