firebase orderByChild只返回一个孩子的怪异顺序

时间:2017-01-28 02:42:31

标签: android firebase firebase-realtime-database

我有一个firebase架构,其中包含“Catalog”表,其中包含一些值

目录表

enter image description here

我使用avgDrinkPrice作为订单执行了orderByChild(),输出错误。

输出

enter image description here

代码

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排序时,订单才会出错。我不明白为什么。请帮忙。

1 个答案:

答案 0 :(得分:3)

根据您的屏幕截图,avgDrinkPrice属性为string,因此结果 正确排序。只是它们按照词法排序 - 而不是数字排序。

有关Firebase如何按孩子排序here时对数据进行排序的更多信息:

  

使用orderByChild()时,包含指定子键的数据将按如下方式排序:

     
      
  1. 指定子键值null的子项首先出现。
  2.   
  3. 下一个指定子键值为false的子项。如果多个子项的值为false,则按键按字典顺序排序。
  4.   
  5. 接下来是指定子键值为true的子项。如果多个子项的值为true,则按键按字典顺序排序。
  6.   
  7. 接下来是具有数值的儿童,按升序排序。如果多个子项具有指定>的相同数值子节点,它们按键排序。
  8.   
  9. 字符串在数字之后,按字典顺序按升序排序。如果多个子节点具有指定子节点的相同值,则按键按字典顺序排序。
  10.   
  11. 对象排在最后,按键按字典顺序按升序排序。
  12.   

要让孩子以数字方式订购,您必须将avgDrinkPrice存储为数字。 latilongtirating也可能更好地存储为数字。

使用您的latilongtirating属性的排序可能看起来是数字,但这是因为排序的字符串值可能具有相同的位数 - avgDrinkPrice不是这种情况。

相关问题