2016-10-11 8 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に置き換えます。修正は、FIRDatabase.database().reference()の代わりにをFIRDatabase.database().referenceWithPath("posts")に初期化するだけでした。

JSON構造については
+0

startTime()はどのように見えますか? –

+0

私はそれをゼロに設定してテストしましたが、それは役に立たなかった。 – lf215

+0

refとは何ですか? – Dravidian

答えて

1

、: -

"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を使用すると、あなたにそのタイムスタンプが、それはその特定のノードにタイムスタンプを追加するfirebaseサーバーに送信されたばかりのコマンドだとして、これらの値の

今、最も可能性が高いあなたはFIRServerValue.timestamp()からタイムスタンプ値を取得することはできませんとの間にある全データを取得します。

代わりにカスタムタイムスタンプを使用してタイムスタンプを保存し、終了値にはそのタイムスタンプに15分を追加するだけです。

これをお読みくださいManipulate NSDate

関連する問題