2016-10-26 61 views
0

我想从Firebase节点查询活动项目。活动项目由开始日期和结束分隔。
下面是结构的一个示例:如何在Firebase上查询包含时间戳的项目?

{ 
    "items" : { 
     "itme1" : { 
      "data" : "...", //some data 
      "startDate" : 12345678, 
      "endDate" : 23456789 
     }, 
     "item2" : {...} 
    } 
} 

日期是火力地堡时间戳,以防止用户时移。

//Init data to save 
var dictionary = Dictionary<String,Any>() 
dictionary["data"] = "some data" 
dictionary["startDate"] = FIRServerValue.timestamp() 

//Save data on Firebase 
let itemRef = FIRDatabase.database().reference(withPath: "items").childByAutoId() 
itemRef.setValue(dictionary) 

//Set end date 
itemRef.observeSingleEvent(of: FIRDataEventType.value, with: { (snapshot) in 
    if let dict = snapshot.value as? NSDictionary, let createdAt = dict["startDate"] as? TimeInterval { 
     let startDate = Date(firebaseTimestamp: createdAt) 
     let endDate = startDate.dateByAddingHours(1) //Add one hour to startDate 
     itemRef.updateChildValues(["endDate":endDate.timeIntervalSince1970 * 1000]) 
    } 
}) 

我如何查询火力地堡获得的物品,其中endDate >= FIRServerValue.timestamp()(主动项):
一个项目这样就节省火力地堡的服务器上?

由于Firebase时间戳FIRServerValue.timestamp()只能在Firebase上写入后才能知道,因此我无法直接查询FIRServerValue.timestamp()。 也许有更好的方法来设置endDate。人们如何处理这个问题?

+1

你无法在endDate上查询的原因startingAtValue(currentTimeStamp)?这将返回endDate大于当前时间的所有节点。也许我不完全理解这个问题?您是否总是希望将当前时间戳写入开始日期,并且结束日期总是在一小时后? – Jay

+0

我可以查询'endDate startingAtValue(currentTimeStamp)',但为了得到currentTimeStamp我需要在Firebase上第一次保存'FIRServerValue.timestamp()'以获得当前值。这将是一个耗费资源的查询,所以也许有另一种解决时间戳的方法。 – Bogy

+0

是的,我总是想保存当前时间戳,因为开始日期和结束日期可能会有所不同(1小时或更长时间)。 – Bogy

回答

0

你可以尝试这样的事情。这只会查询结束日期等于当前日期或更大的项目。

let removeBeforeThisDate = NSDate() 
let currentDateTimestamp = removeBeforeThisDate.timeIntervalSince1970 

itemRef.queryOrderedByChild("endDate").queryStartingAtValue(currentDateTimestamp).observeEventType(.Value, withBlock: { snapshot in 
... 
+0

我同意,但如果用户更改设备的时间,则可以轻松地修改时间戳。 – Bogy

+0

您可以使用let serverTime = ServerValue.timestamp(),您可以将其作为值传递给查询。服务器将在收到时将其解释为当前时间戳。在这里寻找更多的信息:https://stackoverflow.com/questions/25536547/how-do-i-get-a-server-timestamp-from-firebases-ios-api – DoesData