2016-10-11 9 views
5

To jest mój model danych.Sortowanie i limit Firebase - obserwator nie nazywa się

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

Chciałbym tylko pobierać posty w ciągu ostatnich 15 minut. Widzę, że dodano do moich dzieci konsoli Firebase Console, ale problem polega na tym, że obserwator nie wydaje się być wywoływany - "hello" nie jest drukowany.

My iOS ma następujący kod, który nie robi się powołać:

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") 
     }) 

    } 
} 

Moja aplikacja Android ma następujący kod, który robi się powoływać:

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"); 
     ... 
    } 
} 

Aktualizacja: Mój błąd nie zdał sobie sprawy, że zainicjowałem mDatabase (w Androidzie ve rsion) ze ścieżką posts. Poprawka polegała po prostu na zainicjowaniu ref z FIRDatabase.database().referenceWithPath("posts") zamiast FIRDatabase.database().reference().

+0

Co startTime() wygląda? –

+0

Testowałem z ustawieniem go na zero i to nie pomogło. – lf215

+0

Co to jest ref? ... – Dravidian

Odpowiedz

1

Struktura 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 
    } 
} 

użyć tego kodu: -

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 


    }) 

Upewnij się, że zasady zabezpieczeń pozwala użytkownikowi na odzyskanie posts wartość na

Korzystanie .ChildAdded zostaje wywołana tylko wtedy, gdy węzeł podrzędny jest dodawany do tego węzła bazy danych. Korzystanie .Value pobierze Ci całą danych, którego znacznik czasu jest między tymi wartość na

Teraz najprawdopodobniej nie można uzyskać wartość znacznika czasu z FIRServerValue.timestamp() jak to tylko polecenia wysyłane do serwera Firebase dodać znacznik czasu w danym węźle .

Zamiast tego użyj niestandardowej sygnatury czasowej do przechowywania znacznika czasu, a do wartości końcowej dodaj 15 min do tego znacznika czasu.

Przeczytaj ten Manipulate NSDate