Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 排序数据实际上并不排序任何东西_Firebase_Firebase Realtime Database_Flutter - Fatal编程技术网

Firebase 排序数据实际上并不排序任何东西

Firebase 排序数据实际上并不排序任何东西,firebase,firebase-realtime-database,flutter,Firebase,Firebase Realtime Database,Flutter,我正在尝试从firebase数据库中获取消息数据集,并希望消息按添加的/时间戳排序。但由于某些原因,我在代码中输入的orderby实际上没有被使用。我试着做这两件事 _messagesRef = FirebaseDatabase.instance.reference().child('messages/'+key); _membersSubscription = _messagesRef .orderByChild('timestamp') .onValue//On valuec

我正在尝试从firebase数据库中获取消息数据集,并希望消息按添加的/时间戳排序。但由于某些原因,我在代码中输入的orderby实际上没有被使用。我试着做这两件事

_messagesRef = FirebaseDatabase.instance.reference().child('messages/'+key);
_membersSubscription = _messagesRef
    .orderByChild('timestamp')
    .onValue//On valuechange
    .listen((Event event) => _messagesSubscriptionCallback(event)); 

 _messagesRef = FirebaseDatabase.instance.reference().child('messages/'+key);
 _membersSubscription = _messagesRef
    .orderByKey()
    .onValue//On valuechange
    .listen((Event event) => _messagesSubscriptionCallback(event)); 
两者都返回相同的数据集,该数据集在回调中不按时间戳或键排序。我已经在下面添加了输出

{  
   -LA-Aw6crEAV53LxdujP:{  
      sender:1508,
      message:test s9 2,
      timestamp:1523642778089
   },
   -LA-Arby61T1UG5URMn6:{  
      sender:1508,
      message:test s9,
      timestamp:1523642759679
   },
   -LA-AyC7F8KAqceZBE3j:{  
      sender:1509,
      message:test emu 1,
      timestamp:1523642786632
   },
   -LA22WiUfL2tbh7-OjtM:{  
      sender:1508,
      message:Blaj,
      timestamp:1523690904480
   },
   -LA-B29RRXbdOPT1mG7m:{  
      sender:1508,
      message:tesy3,
      timestamp:1523642806940
   }
}
数据应该是这样的

我希望有人能帮我解决这个问题。我想我可能误解了订购数据与Firebase的关系

亲切问候,,
Namanix现在通过在回调中执行此操作临时修复了它。但这感觉像是一个非常糟糕的修复方法。我希望得到一些关于这方面的想法

static void _messagesSubscriptionCallback(Event event) {
    _messagesList.clear();
    _messages.clear();
    _messages = event.snapshot.value;
    _messagesList = _messages.keys.toList();
    _messagesList.sort((a, b) {
        return b.compareTo(a) ;
    });
    onMessagesChange();
}

我现在通过在回调中执行此操作临时修复了它。但这感觉像是一个非常糟糕的修复方法。我希望得到一些关于这方面的想法

static void _messagesSubscriptionCallback(Event event) {
    _messagesList.clear();
    _messages.clear();
    _messages = event.snapshot.value;
    _messagesList = _messages.keys.toList();
    _messagesList.sort((a, b) {
        return b.compareTo(a) ;
    });
    onMessagesChange();
}

显示的结果是一个JSON对象,其中包含其他对象。据我所知,JSON对象从不排序,只能通过键检索。JSON数组可能是,但看起来你没有得到。当您将其更改为数组时,文档ID必须位于文档内部,而不是对象键。我猜“orderBy”是用来限制分页的项目数量的。然后,您可以按时间戳订购,将项目数量限制为20个,并从您获得的最后一个时间戳开始搜索


我想如果你想对它们进行排序,我会把它们放在一个新的对象列表中,这个列表可以进行排序。

你显示的结果是一个JSON对象,其中有其他对象。据我所知,JSON对象从不排序,只能通过键检索。JSON数组可能是,但看起来你没有得到。当您将其更改为数组时,文档ID必须位于文档内部,而不是对象键。我猜“orderBy”是用来限制分页的项目数量的。然后,您可以按时间戳订购,将项目数量限制为20个,并从您获得的最后一个时间戳开始搜索

我想如果你想对它们进行排序,我会把它们放在一个可以排序的新对象列表中。

最有可能的情况是(如果没有看到
\u messagesSubscriptionCallback
),当你将Firebase中的数据转换成一个简单的JSON对象时,你就把排序信息扔掉了(正如Rene所说的)没有任何定义的顺序

但是您从Firebase请求的数据确实包含订购信息,您只需确保不要删除它

通常的方法是监听
onchildaded
,而不是
onValue
。使用该方法,Firebase将依次为每个孩子调用
onchildaded
,并按照您请求的顺序执行

另请参见和,例如。

最有可能的情况是(如果没有看到
\u messagesSubscriptionCallback
,就很难确定),当您将Firebase中的数据转换为没有任何定义顺序的纯JSON对象时,您将丢弃顺序信息

但是您从Firebase请求的数据确实包含订购信息,您只需确保不要删除它

通常的方法是监听
onchildaded
,而不是
onValue
。使用该方法,Firebase将依次为每个孩子调用
onchildaded
,并按照您请求的顺序执行


另请参见和示例。

好问题,哈哈。忘了加上那个。键等于“一”,在这个评论中毫无意义。但是如果你看屏幕截图,你会看到“一”是什么:)不幸的是还是一样的输出好问题哈哈。忘了加上那个。键等于“一”,在这个评论中毫无意义。但是如果你看屏幕截图,你会看到“一”是什么:)不幸的是,还是一样的输出。这基本上就是我在自己的回答中所做的。我现在就这样保存它。谢谢你的反馈!嗯,好的。这基本上就是我在自己的回答中所做的。我现在就这样保存它。谢谢你的反馈!非常感谢。我来查一查!我的_messagesSubscriptionCallback作为此问题的答案发布。所以你可以在那里看到它。但你的解释很有道理。我来看看这个例子谢谢!我来查一查!我的_messagesSubscriptionCallback作为此问题的答案发布。所以你可以在那里看到它。但你的解释很有道理。我来看看这些例子