Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.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
Swift Firebase查询顺序工作不正常_Swift_Firebase_Tableview_Firebase Realtime Database - Fatal编程技术网

Swift Firebase查询顺序工作不正常

Swift Firebase查询顺序工作不正常,swift,firebase,tableview,firebase-realtime-database,Swift,Firebase,Tableview,Firebase Realtime Database,基本上,我在过去的一周里一直在使用Firebase,最近我偶然发现了“queryOrderedByChild()”,据我所知,它允许您在Firebase中对数据进行排序。然而,我似乎没有得到正确的结果。我的Firebase数据如下所示: { "names" : { "-KHVUwXdVPHmrO_O5kil" : { "id" : "0", "name" : "Jeff" }, "-KHVV7lCeac0cZNMi9fq" : {

基本上,我在过去的一周里一直在使用Firebase,最近我偶然发现了“queryOrderedByChild()”,据我所知,它允许您在Firebase中对数据进行排序。然而,我似乎没有得到正确的结果。我的Firebase数据如下所示:

{
  "names" : {
    "-KHVUwXdVPHmrO_O5kil" : {
      "id" : "0",
      "name" : "Jeff"
    },
    "-KHVV7lCeac0cZNMi9fq" : {
      "id" : "3",
      "name" : "Stig"
    },
    "-KHVVCjXgl0XxasVOHF1" : {
      "id" : "13",
      "name" : "Ali"
    },
    "-KHVVJtyUO-yJZiompJO" : {
      "id" : "7",
      "name" : "Hannah"
    },
    "-KHVVR8tMSO1Oh7R8tR1" : {
      "id" : "2",
      "name" : "Amanda"
    }
  }
}
ref.childByAppendingPath("names")
   .queryOrderedByChild("id")
   .observeEventType(.ChildAdded) { (snapshot:FDataSnapshot!) in
       if let myID = snapshot.value["id"] as? String {
           print(myID)
       }
,我的代码如下所示:

{
  "names" : {
    "-KHVUwXdVPHmrO_O5kil" : {
      "id" : "0",
      "name" : "Jeff"
    },
    "-KHVV7lCeac0cZNMi9fq" : {
      "id" : "3",
      "name" : "Stig"
    },
    "-KHVVCjXgl0XxasVOHF1" : {
      "id" : "13",
      "name" : "Ali"
    },
    "-KHVVJtyUO-yJZiompJO" : {
      "id" : "7",
      "name" : "Hannah"
    },
    "-KHVVR8tMSO1Oh7R8tR1" : {
      "id" : "2",
      "name" : "Amanda"
    }
  }
}
ref.childByAppendingPath("names")
   .queryOrderedByChild("id")
   .observeEventType(.ChildAdded) { (snapshot:FDataSnapshot!) in
       if let myID = snapshot.value["id"] as? String {
           print(myID)
       }

输出仍然以随机顺序显示:0、2、7、1、8、4-这不是应该是数字吗?我做错了什么?如何对其进行排序,使其为升序或降序数字?

您说您是按数字排序的,但是
id
属性的值存储为字符串

由于您将它们存储为字符串,因此它们将在中返回

如果希望它们按数字顺序排列,则应将它们存储为数字

"-KHVUwXdVPHmrO_O5kil" : {
  "id" : 0,
  "name" : "Jeff"
},
或者,您可以将ID存储为零填充字符串:

{
  "names" : {
    "-KHVUwXdVPHmrO_O5kil" : {
      "id" : "0000",
      "name" : "Jeff"
    },
    "-KHVV7lCeac0cZNMi9fq" : {
      "id" : "0003",
      "name" : "Stig"
    },
    "-KHVVCjXgl0XxasVOHF1" : {
      "id" : "0013",
      "name" : "Ali"
    },
    "-KHVVJtyUO-yJZiompJO" : {
      "id" : "0007",
      "name" : "Hannah"
    },
    "-KHVVR8tMSO1Oh7R8tR1" : {
      "id" : "0002",
      "name" : "Amanda"
    }
  }
}

由于字符串的长度都相同,因此它们将按正确的顺序排序。但是,在后一种解决方案中,您必须决定字符串的长度/最大id值,因此情况似乎更糟。

如果您使用“按孩子排序”,则您将对您的
id进行排序,而不会触及它的值

那也许你得试试像这样的东西

  • (FIRDatabaseQuery*)queryOrderedByValue
    queryOrderedByValue:用于生成对按子值排序的数据视图的引用

如果看不到数据,很难说出具体的话。请添加一个最小的JSON片段,让我们重现这个问题。请将其添加为文本,您可以通过单击Firebase仪表板中的导出按钮轻松获得。以下是JSON代码:{code>{“name”:{“-KHVUwXdVPHmrO_O5kil”:{“id”:“0”,“name”:“Jeff”},“-KHVV7lCeac0cZNMi9fq”:{“id”:“3”,“name”:“Stig”},“-khvvvcjxgl0xxasvoh1”:{“id”:“13”、“姓名”:“Ali”}、-KHVVJtyUO yJZiompJO:{“id”:“7”、“姓名”:“Hannah”}、-KHVVR8tMSO1Oh7R8tR1:{“id”:“2”、“姓名”:“Amanda”}
并且输出只是以随机顺序显示ID。在您的问题下有一个编辑链接,您可以将其添加到其中。这也允许您将其以更可读的格式放置。@FrankvanPuffelen我现在编辑了它。您似乎知道问题出在哪里吗?请确保您实际上正在循环快照子项。如果您只需打印快照,它的排序方式与标准JSON相同,而不是从firebase服务器返回的方式。感谢您为我整理此快照!您知道这是否适用于“双精度”快照吗?假设我想显示一个新的降阶帖子(按双精度时间戳排序查询),这可能吗?而且,如果我要这样做-我可以使用queryLimitedToLast来代替吗,或者两者都使用吗?提前谢谢-当然,谢谢你帮我整理一下。我不得不说,我对这种误解有点不好意思。如果你将双精度存储为字符串,你也会遇到同样的问题。但是时间戳通常是mi从纪元开始的秒数,如此常规(非浮点)数字,看起来Firebase不会对Double值进行排序,即使它存储为Double?您建议将什么作为数据来实现,以跟踪用户提交帖子的日期,以便在应用程序中读取该帖子发布的时间?Firebase会对Double值进行排序,请参阅。如果您认为有问题,请创建一个最小的我要考虑的是这个问题。如果你把它放在jsbin/JSFIDLE这样的网站上,通常效果最好。就我而言,jsbin或JSFIDLE都不支持Swift。但是,我可以向你提供我正在使用的当前Swift代码,以尝试按降序对双值进行排序。设置值:
ref.childByAppendingPath(“posts”).childByAutoId().setValue([“message”:statusField.text!,“sender:“Andreas”,“date”:NSDate().timeIntervalSince1970]){(错误,firebase)在if error!=nil{print(“”)}else{}