2016-10-26 37 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