2017-08-11 36 views
1

我想通过使用orderByChild进行查询并使用这些子项的键进行筛选。在这种情况下,我的键和值都是用于查询我想要的数据。如何使用startAt(double value,String key)和endAt(double value,String key)Android中的Firebase实时数据库

我的问题是当钥匙包含数字,如果钥匙只有字母,则没有问题。因为我直接从火焰阅读器读取another answer中的建议,所以我试图始终保持数字上的字母。

我的JSON是:

{ 
    "my_list":{ 
    "100xyz":{ 
     "value1": 100, 
     "value2": 100, 
     "name":"100xyz" 
    }, 
    "200xyz":{ 
     "value1": 200, 
     "value2": 200, 
     "name":"200xyz" 
    }, 
    "300xyz":{ 
     "value1": 300, 
     "value2": 300, 
     "name":"300xyz" 
    }, 
    "400xyz":{ 
     "value1": 400, 
     "value2": 400, 
     "name":"400xyz" 
    }, 
    "500xyz":{ 
     "value1": 500, 
     "value2": 500, 
     "name":"500xyz" 
    } 
    } 
} 

我的代码是:

DatabaseReference root = FirebaseDatabase.getInstance().getReference().getRoot(); 
DatabaseReference list = root.child("my_list"); 
list.orderByChild("value2").startAt(100, "100xyz").endAt(500, "200xyz").addChildEventListener(new ChildEventListener() { 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     SomeModel someModel = dataSnapshot.getValue(SomeModel.class); 
     Log.d("SOME_MODEL", someModel.getName()); 
    } 
}); 

的问题是,我可以看到4个孩子的控制台:

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 
D/SOME_MODEL: 300xyz 
D/SOME_MODEL: 400xyz 

但我只应看过2

D/SOME_MODEL: 100xyz 
D/SOME_MODEL: 200xyz 

我想强调一下:只要键没有数字,它确实有效。

如何通过orderByChild和键同时按键有数字来过滤?

+0

因为我很可能是您谈论的问题中回答的Firebaser(当您提到另一个问题时,总是会欣赏链接),所以我很乐意提供帮助。您是否可以通过单个相应的代码示例将问题简化为单个JSON,以重现问题? –

+0

@FrankvanPuffelen对不起,跳过链接,我试图从昨天开始解决这个问题,现在有点累了。我已经应用了您建议的版本。请让我知道是否还有其他事情可以改善我的问题。 – cutiko

+0

为什么你不使用'startAt(String value,String key)'?你认为“双重”价值是什么意思? –

回答

0

您似乎认为将两个参数传递给endAt()会使查询以无论哪个值或关键位于何处结束。这不是查询在Firebase中的工作方式。

endAt()的第二个参数仅在查询找到与第一个参数匹配的节点后才会使用。

所以当你通过endAt(500, "200xyz")时,数据库首先在value2等于value2(第一个参数)的节点上过滤。这意味着它发现该节点作为查询的末尾:

"500xyz":{ 
    "value1": 500, 
    "value2": 500, 
    "name":"500xyz" 
} 

然后,它使用键200xyz(第二个参数),以确定是否包括该节点或不(技术上:其中在多个节点的列表结束返回)。由于密钥200xyz500xyz前的查询结果不包括这个节点上,从而导致:

"100xyz":{ 
    "value1": 100, 
    "value2": 100, 
    "name":"100xyz" 
}, 
"200xyz":{ 
    "value1": 200, 
    "value2": 200, 
    "name":"200xyz" 
}, 
"300xyz":{ 
    "value1": 300, 
    "value2": 300, 
    "name":"300xyz" 
}, 
"400xyz":{ 
    "value1": 400, 
    "value2": 400, 
    "name":"400xyz" 
}, 

另见:

相关问题