Firebase按日期排序数据

时间:2017-03-13 20:35:47

标签: 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",
    "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)
        }
})

由于

2 个答案:

答案 0 :(得分:4)

您的数据 按键(日期)排序,但问题是您的密钥是字符串,字符串按字母顺序排序。因此,您将首先获得所有 F 周五,然后 M ,等等。

要按时间顺序排序 ,您需要使用表示日期为升序数字的格式,即时间戳。 Firebase有一个非常好的快捷方式,可以在将timestamps写入数据库时​​以标准格式自动填充arrays,但不幸的是,只有当您需要创建数据的时间时才适用。但是,为任意日期和时间生成时间戳并不困难,而且有很多库可以在UI中来回转换为您喜欢的任何人类可读格式。如果您 对日期感兴趣,您可以使用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"
  } ]
 }
}

您在数据中使用{{3}}时所做的事情也非常不明智,但对于另一个话题则是如此。

答案 1 :(得分:0)

Firebase有自己的密钥(它为您生成的UID),并默认使用orderedBy_查询对其进行优先级排序。这些默认密钥按添加的时间/日期划分优先级。

你(可能)想要的是“孩子”订购,这本质上是你自己的钥匙。请尝试以下方法:

ref.queryOrdered(byChild: "Id") 

或您喜欢的其他任何子键。