Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.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
Ios Firebase按日期排序数据_Ios_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Ios Firebase按日期排序数据

Ios Firebase按日期排序数据,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在尝试按日期对我得到的数据进行排序,但它不起作用。 这是我要排序的数据: { "events": { "Saturday, May 6, 2016" : [ null, { "Id" : 3, "LogoImage" : "image_url", "MainImage" : "image_url", "Name" : "event_name" }, { "Id" : 4, "LogoImage" : "image_url", "

我正在尝试按日期对我得到的数据进行排序,但它不起作用。 这是我要排序的数据:

{
"events": {
  "Saturday, May 6, 2016" : [ null, {
    "Id" : 3,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  }, {
    "Id" : 4,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  } ],
  "Saturday, April 8, 2016" : [ null, {
    "Id" : 1,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  }, {
    "Id" : 2,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  } ]
 }
}
我希望它们按日期排序,但问题是日期是项目列表的关键。 我该怎么做

我已经试过了,但不起作用:

ref.child("events").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in
    let results = snapshot.value as! [String: Any]
        for (eventDate, arr) in results {
            let eventsDate = EventsDate()
            eventsDate.eventsDate = eventDate
            print(eventDate)
        }
})
谢谢

Firebase有自己的密钥(它为您生成的UID),并在默认情况下通过查询对这些密钥进行优先级排序。这些默认键按添加的时间/日期排列优先级

您(可能)想要的是按“child”订购,这基本上是您自己的钥匙。请尝试以下操作:

ref.queryOrdered(byChild: "Id") 
或者您喜欢的任何其他子键。

您的数据是按键(日期)排序的,但问题是您的键是字符串,字符串是按字母顺序排序的。所以你要先得到所有的Friday,然后是Monday,依此类推

要按时间顺序排序,您需要使用以升序数字表示日期的格式,即时间戳。Firebase有一个漂亮的快捷方式,可以在将数据写入数据库时以标准格式自动填充,但不幸的是,这仅适用于需要创建数据的时间的情况。然而,为任意日期和时间生成时间戳并不困难,有很多库可以将其来回转换为用户界面中喜欢的任何人类可读格式。如果您只对日期感兴趣,则可以使用简单的可排序格式,如ISO-8601:

{
"events": {
  "2016-05-06" : [ null, {
    "Id" : 3,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  }, {
    "Id" : 4,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  } ],
  "2016-04-08" : [ null, {
    "Id" : 1,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  }, {
    "Id" : 2,
    "LogoImage" : "image_url",
    "MainImage" : "image_url",
    "Name" : "event_name"
  } ]
 }
}

您在数据中所做的操作也是非常不可取的,但这是另一个主题。

您应该让Firebase为您创建id。它们是使用创建数据的时间生成的,它会自动为您排序数据。您不需要为
queryOrderedByKey()
提供密钥吗?您在回调中做什么?很可能您正在将快照转换为字典,这实际上会降低顺序(因为字典本身就是无序的)。为确保按正确的/键顺序获取项目,请循环查看
snapshot.children
@Joakim这是事件发生的日期,因此不是事件添加到数据库的日期。@Danieller否,因为键是日期。。并且该函数不接受任何参数。这将按id对其进行排序。。我想在日期前完成。这是事件的日期(事件发生的时间),因此不是事件添加到数据库的时间。“日期”是数据库中的“子”键吗?如果是这样,同样的逻辑也适用。使用date而不是ID。在数据库中找到与“date”对应的子项(查看firebase.com上的数据库),并使用上面的代码应用该项。谢谢,我将尝试并告知结果。你现在能告诉我数据中的数组有什么问题吗?谢天谢地,除了非常特殊的情况外,数组在Firebase中通常是一个坏主意,因为它们被转换为整数键控映射,并且在数据更新时很难保持其索引的一致性。最好使用push-ID、priority或其他一些有意义的值进行排序,如我链接的文章中所讨论的。我不能给出具体的建议,除非你对你的应用有更多的了解,但你可能需要以一种更好地支持你所需要的查询的方式。