我有一个Firebase数据库结构如下:
{
"listings" : {
"-KOt8OUGkUphoMyqEXJ2" : {
"created" : 1470911323208,
"ends" : 1470911323209,
"make" : "LONDON TAXIS INT",
"model" : "TX4 BRONZE",
"status" : "For Sale",
},
"-KOt97_P8sJW7woED4aH" : {
"created" : 1470911515115,
"ends" : 1471775515000,
"make" : "NISSAN",
"model" : "QASHQAI N-TEC",
"status" : "For Sale",
},
"-KOt_BYYUEaXu_LNvnUv" : {
"created" : 1470918609414,
"ends" : 1471782609000,
"make" : "MAZDA",
"model" : "3 TS",
"status" : "For Sale",
}
}
}
我使用GeoFire获取给定半径中列表的键。然后我使用observeSingleEventOfType返回键的列表。一切正常。
但是,我想只返回一个列表,如果"结束"时间戳>当前时间。我尝试了以下方法:
geoQueryHandle = geoQuery.observeEventType(.KeyEntered, withBlock: {(key, location) in
let listingRef = self.ref.child("listings").child(key)
let now = Int(NSDate().timeIntervalSince1970 * 1000)
let query = listingRef.queryStartingAtValue(now, childKey: "ends")
query.observeSingleEventOfType(.Value, withBlock: {snapshot in
if let listing = Listing(snapshot: snapshot, location: location) {
//...populate my tableview
}
}
})
有人可以告诉我为什么我的查询不起作用吗?
由于
答案 0 :(得分:0)
Firebase查询将排序/过滤应用于您执行它们的位置的子节点的属性。
queryLocation
child1
filterProperty: filterValue
child2
filterProperty: filterValue
由于您的listingRef
已经指向特定列表,因此您添加的订单/过滤器将应用于更深层次的子节点。
让用例工作的最简单方法似乎只是过滤客户端节点:
let listingRef = self.ref.child("listings").child(key)
query.observeSingleEventOfType(.Value, withBlock: {snapshot in
if let listing = Listing(snapshot: snapshot, location: location) {
let now = Int(NSDate().timeIntervalSince1970 * 1000)
// TODO: exit if snapshot.child("ends").getValue() < now
//...populate my tableview
}
}
实现此目标的更复杂但更有效的方法是从Geofire位置删除过期事件。