2016-10-26 12 views
0

Firebaseノードからアクティブなアイテムを照会します。アクティブな項目は、開始日と終了日で区切られます。ここ
は、構造体のサンプルである:Firebaseでタイムスタンプのあるアイテムを照会するには?

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

日付は、ユーザタイムシフトを防止するFirebaseタイムスタンプです。
項目は、次のようにFirebaseサーバー上に保存されます。

//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を照会することができますか?

firebaseタイムスタンプFIRServerValue.timestamp()はFirebaseで書かれた後でしか知ることができません。FIRServerValue.timestamp()に直接問い合わせることはできません。 おそらく、endDateを設定するより良い方法があります。人々はこれをどのように扱うのですか?

+1

endDateのstartingAtValue(currentTimeStamp)で照会できない理由は何ですか?これは、endDateがcurrentTimeより大きいすべてのノードを返します。多分私はその質問を完全に理解していないでしょうか?常に現在のタイムスタンプを開始日として書きますが、終了日は常に1時間後になりますか? – 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

関連する問題