2016-10-11 52 views
5

這是我的數據模型。iOS Firebase排序和限制 - 觀察員不叫

project-foo 
-posts 
    -KLs123412341234 
    key: "-KLs123412341234" 
    message: "free cupcakes" 
    time: 1467675688163 
    -... 
    key: "..." 
    message: "..." 
    time: ... 

我想只在過去15分鐘內抓取帖子。 我在我的Firebase控制檯中看到正在添加的孩子,但問題在於觀察者似乎沒有被調用 - "hello"未打印。

我的iOS應用具有下面的代碼,這被調用:

class ViewController: UIViewController { 

    var ref: FIRDatabaseReference? 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     ref = FIRDatabase.database().reference() 
     ref!.queryOrderedByChild("time") 
      .queryStartingAtValue(startTime()) 
      .observeEventType(.ChildAdded, withBlock: { snapshot in 
      print("hello") 
     }) 

    } 
} 

我的Android應用程序有下面的代碼,這確實被調用:

Query query = mDatabase.orderByChild("time").startAt((double)startTime()); 
query.addChildEventListener(new PostListener(this, mMap)); 

class PostListener implements ChildEventListener { 
    public PostListener(Context context, GoogleMap map) { 
     ... 
    } 

    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s) { 
     Log.i(TAG, "hello"); 
     ... 
    } 
} 

更新: 我的錯誤是沒有意識到我已經初始化了mDatabase(在android ve rsion)與路徑posts。該修復只是初始化refFIRDatabase.database().referenceWithPath("posts")而不是FIRDatabase.database().reference()

+0

startTime()是什麼樣子的? –

+0

我將它設置爲零進行測試,並沒有幫助。 – lf215

+0

什麼是ref?... – Dravidian

回答

1

對於JSON結構: -

"posts" : { 
    "autoID1" : { 
    "key" : "autoID1", 
    "timestamp" : 101 
    }, 
    "autoID2" : { 
    "key" : "autoID2", 
    "timestamp" : 102 
    }, 
    "autoID3" : { 
    "key" : "autoID3", 
    "timestamp" : 103 
    }, 
    "autoID4" : { 
    "key" : "autoID4", 
    "timestamp" : 104 
    }, 
    "autoID5" : { 
    "key" : "autoID5", 
    "timestamp" : 105 
    }, 
    "autoID6" : { 
    "key" : "autoID6", 
    "timestamp" : 106 
    }, 
    "autoID7" : { 
    "key" : "autoID7", 
    "timestamp" : 107 
    } 
} 

使用此代碼: -

FIRDatabase.database().reference().child("posts").queryOrderedByChild("timestamp").queryStartingAtValue(101).queryEndingAtValue(103).observeEvenType(.Value, with: { (snap) in 
     if let snapDict = snap.value as? [String:AnyObject]{ 

      for each in snapDict{ 

       print(each.value) 

      } 
      } 
     }, withCancel: {(err) in 


    }) 

確保您的安全規則,允許用戶檢索posts值的

使用.ChildAdded只有當一個子節點被添加到該數據庫節點時纔會被調用。使用.Value將檢索你的整個數據,其時間戳之間的那些值的

現在最有可能你不能得到FIRServerValue.timestamp()時間戳值,因爲它只是發送到火力服務器的命令,在那個特定的節點添加時間戳。

因此改爲使用自定義時間戳來存儲您的時間戳,併爲結束值只需將15分鐘添加到該時間戳。

閱讀本文Manipulate NSDate