我正在尝试按日期对数据进行排序,但似乎数据是随机出现的。谁能告诉我为什么我的queryOrdered(byChild: "startDate")
不起作用?我如何对数据进行排序?
您可以在此处查看我的数据结构: Complex Query
代码:
DataService.ds.REF_USER_CURRENT.child("logs").observeSingleEvent(of: .value, with: {(userSnap) in
if let SnapDict = userSnap.value as? [String:AnyObject]{
//Run through all the logs
for each in SnapDict{
FIRDatabase.database().reference().child("logs/\(each.key)").queryOrdered(byChild: "startDate").observeSingleEvent(of: .value , with : {(Snap) in
let period = Period(logId: each.key, postData: Snap.value as! Dictionary<String, AnyObject>)
self.periods.append(period)
print(period.duration)
print(period.startDate)
self.tableView.reloadData()
})
}
}
})
期间:
struct Period {
var _periodId: String!
var _startDate: String!
var _duration: Int!
var logs = [Log]()
var _periodRef: FIRDatabaseReference!
init() {
}
init(logId: String, postData: Dictionary<String, AnyObject>) {
self._periodId = logId
if let startDate = postData["startDate"] {
self._startDate = startDate as? String
}
if let duration = postData["duration"] {
self._duration = duration as? Int
}
_periodRef = DataService.ds.REF_PERIODS.child(_periodId)
}
}
答案 0 :(得分:1)
更改您的dataStructure。
保留日志的索引,如: -
logs
-KVMbJKN1i2vAxzutiYq
duration: 14
index : 1
startDate: 28/10/2016
-KVMbLL4i_9dwaRZ9REB
duration: 28
index : 2
startDate: 01/09/2016
-KVMiLwoSY34TZpf8mST
duration: 14
index : 3
startDate: 2/2/2016
totalNoOfLogs : 3
如果您在使用tableView重新加载数据之前使用struct,只需对
进行排序self.periods.sort(by: {$0.index_Initial > $1.index_Initial})
你的结构: -
struct Period {
var _periodId: String!
var _startDate: String!
var _duration: Int!
var index_Initial : Int!
....}
index_Initial
是您的日志索引。检索并存储到您的结构中。
对于 index ,您可以在数据库中保留一个单独的节点,跟踪 totalNoOfLogs ,并在每次用户创建日志时将其递增。
或者您可以尝试: -
FIRDatabase.database().reference().child("periods").observeSingleEvent(of: .value, with: {(userSnap) in
for each in userSnap.children{
if let eachSnapDict = (each as! FIRDataSnapshot).value as? [String:AnyObject]{
print(eachSnapDict)
}
}
})
但是这种方法只有在数据以排序的方式存储在数据库中时才会起作用(不是优先选项)