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或其他一些有意义的值进行排序,如我链接的文章中所讨论的。我不能给出具体的建议,除非你对你的应用有更多的了解,但你可能需要以一种更好地支持你所需要的查询的方式。