firebase orderByChild 只为一个孩子返回奇怪的订单

Jam*_*mes 2 android firebase firebase-realtime-database

我有一个 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.
Run Code Online (Sandbox Code Playgroud)

我尝试使用其他数值进行排序,例如纬度字段、经度和评级,它们的顺序是正确的。只有按 avgDrinkPrice 排序时,顺序才会出错。我不明白为什么。请帮忙。

car*_*ant 5

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

在按子项排序时,有更多关于 Firebase 如何对数据进行排序的信息,请点击此处

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

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

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

使用lati,longtirating属性的排序可能看起来是数字,但那是因为排序的字符串值可能具有相同的位数 - 而avgDrinkPrice.