我有一个firebase架构,其中包含“Catalog”表,其中包含一些值
目录表
我使用avgDrinkPrice作为订单执行了orderByChild(),输出错误。
输出
代码
myRef.orderByChild("avgDrinkPrice").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
catalogList.clear();
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
Catalog catalog = postSnapshot.getValue(Catalog.class);
catalogList.add(catalog);
Log.d(TAG,"Drink price " + catalog.getAvgDrinkPrice());
catalogSize++;
}
//LOOP ENDS.
我尝试使用其他数值进行排序,例如纬度字段,经度和评级,并且它们的顺序是正确的。 只有在按avgDrinkPrice排序时,订单才会出错。我不明白为什么。请帮忙。
答案 0 :(得分:3)
根据您的屏幕截图,avgDrinkPrice
属性为string
,因此结果 正确排序。只是它们按照词法排序 - 而不是数字排序。
有关Firebase如何按孩子排序here时对数据进行排序的更多信息:
使用
orderByChild()
时,包含指定子键的数据将按如下方式排序:
- 指定子键值
null
的子项首先出现。- 下一个指定子键值为
false
的子项。如果多个子项的值为false
,则按键按字典顺序排序。- 接下来是指定子键值为true的子项。如果多个子项的值为
true
,则按键按字典顺序排序。- 接下来是具有数值的儿童,按升序排序。如果多个子项具有指定>的相同数值子节点,它们按键排序。
- 字符串在数字之后,按字典顺序按升序排序。如果多个子节点具有指定子节点的相同值,则按键按字典顺序排序。
- 对象排在最后,按键按字典顺序按升序排序。
醇>
要让孩子以数字方式订购,您必须将avgDrinkPrice
存储为数字。 lati
,longti
和rating
也可能更好地存储为数字。
使用您的lati
,longti
和rating
属性的排序可能看起来是数字,但这是因为排序的字符串值可能具有相同的位数 - avgDrinkPrice
不是这种情况。