【问题标题】:firebase orderByChild returns weird order for only one childfirebase orderByChild 只为一个孩子返回奇怪的订单
【发布时间】:2017-01-28 16:21:10
【问题描述】:

我有一个 firebase 架构,其中包含带有几个值的表“目录”

目录表

我使用 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 排序时才会出现顺序错误。我不明白为什么。请帮忙。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    根据您的屏幕截图,avgDrinkPrice 属性是 string,因此结果已正确排序。只是它们是按字典顺序排序的,而不是按数字排序的。

    有更多关于 Firebase 如何排序数据的信息,当按子排序时,here

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

    1. 具有null 值的指定子键的子优先。
    2. 接下来是指定子键的值为false 的子项。如果多个子节点的值为 false,则它们将按关键字按字典顺序排序。
    3. 接下来是指定子键值为 true 的子项。如果多个子节点的值为 true,则它们将按关键字按字典顺序排序。
    4. 具有数值的子项紧随其后,按升序排列。如果指定>子节点有多个子节点数值相同,则按key排序。
    5. 字符串在数字之后,并按字典顺序升序排序。如果指定子节点的多个子节点具有相同的值,则它们按键按字典顺序排列。
    6. 对象排在最后,并按关键字按字典顺序升序排序。

    要让孩子按数字排序,您必须将avgDrinkPrice 存储为数字。 latilongtirating 也可能更好地存储为数字。

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

    【讨论】:

      猜你喜欢
      • 2018-03-19
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多