2016-07-25 18 views
2

Struktur meiner Firebase Datenbank sieht wie folgt aus:Abrufen von Daten aus Firebase Android Studio

enter image description here

Ich möchte von ihm Abrufen von Daten in einer solchen Weise, dass, wenn ich den Wert der „Name“ ändern in Datenbank wird es in Android Studio sofort ändern. Im Moment verwende ich .addChildEventListner Methode kombiniert mit Map<String, String>. Könnte mir jemand helfen?

Edit: Mein Code:

Firebase markerRef = myFirebaseRef.child("marker"); 

    markerRef.addChildEventListener(new ChildEventListener() { 
     @Override 
     public void onChildAdded(com.firebase.client.DataSnapshot dataSnapshot, String s) { 
      Map<String, String> map = dataSnapshot.getValue(Map.class); 
      double latitude = Double.parseDouble(map.get("Lat")); 
      double longitude = Double.parseDouble(map.get("Lon")); 
      LatLng location = new LatLng(latitude, longitude); 

      String filename = map.get("Name"); 
      String[] splitString = filename.split(","); 


      mMap.addMarker(new MarkerOptions() 
        .position(location) 
        .title(splitString[0]) 
        .snippet(splitString[1]) 
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 
     } 

     @Override 
     public void onChildChanged(com.firebase.client.DataSnapshot dataSnapshot, String s) { 


     } 

     @Override 
     public void onChildRemoved(com.firebase.client.DataSnapshot dataSnapshot) { 

     } 

     @Override 
     public void onChildMoved(com.firebase.client.DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 

     } 
    }); 
+0

den Code zeigen, können wir Ihnen nicht helfen, ohne es –

+0

@DimaRostopira habe ich den Code. – Michal

Antwort

1

In Ihrer Tätigkeit erstellen leer HashMap Hasmap<String, Marker> markers = new Hashmap<>(); Dann in onChildAdded

Marker m = mMap.addMarker(new MarkerOptions() 
         .position(location) 
         .title(splitString[0]) 
         .snippet(splitString[1]) 
         .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED))); 
markers.add.put(dataSnapshot.getKey(), m); 

Und in onChildChanged

Marker m = markers.get(dataSnapshot.getKey()); 
m.setPosition(newLocation); 
//And anything else, that changing 

Und schließlich in onChildRemo ved

+0

Vielen Dank. Alles funktioniert super. :) – Michal

+0

@Michal danke für die Annahme, ich kann endlich Kopfgeld für meine Frage setzen: D –

1

Firebase-Daten werden abgerufen, indem ein asynchroner Listener an eine FirebaseDatabase-Referenz angehängt wird. Der Listener wird einmalig für den Anfangszustand der Daten und immer dann, wenn sich die Daten ändern, ausgelöst.

private DatabaseReference mDatabase; 
mDatabase = FirebaseDatabase.getInstance().getReference(); 

Um einen Wert Ereignis-Listener, verwenden, um die addValueEventListener() oder addListenerForSingleValueEvent() Methode hinzuzufügen. Verwenden Sie die addChildEventListener() -Methode, um einen untergeordneten Ereignis-Listener hinzuzufügen.

Mit der onDataChange() -Methode können Sie einen statischen Snapshot des Inhalts eines bestimmten Pfads lesen, wie er zum Zeitpunkt des Ereignisses vorhanden war. Diese Methode wird einmal ausgelöst, wenn der Listener angeschlossen ist, und jedes Mal, wenn sich die Daten, einschließlich der untergeordneten, ändern. Dem Ereignisrückruf wird ein Snapshot mit allen Daten an diesem Speicherort einschließlich untergeordneter Daten übergeben. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null.

Beispiel: -

ValueEventListener postListener = new ValueEventListener() { 
@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    // Get Post object and use the values to update the UI 
    Post post = dataSnapshot.getValue(Post.class); 
    // ... 
} 

@Override 
public void onCancelled(DatabaseError databaseError) { 
    // Getting Post failed, log a message 
    Log.w(TAG, "loadPost:onCancelled", databaseError.toException()); 
    // ... 
} 
}; 
mPostReference.addValueEventListener(postListener); 

Kinder Ereignisse als Reaktion auf bestimmte Vorgänge ausgelöst werden, die auf die Kinder eines Knotens aus einer Operation passieren wie ein neues Kind aufgenommen durch die push() -Methode oder ein Kind zu sein aktualisiert über die updateChildren() -Methode. Jede dieser Komponenten kann nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank zu überwachen.

Beispiel: -

ChildEventListener childEventListener = new ChildEventListener() { 
@Override 
public void onChildAdded(DataSnapshot dataSnapshot, String  previousChildName) { 
    Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey()); 

    // A new comment has been added, add it to the displayed list 
    Comment comment = dataSnapshot.getValue(Comment.class); 

    // ... 
} 

@Override 
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
    Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey()); 

    // A comment has changed, use the key to determine if we are displaying this 
    // comment and if so displayed the changed comment. 
    Comment newComment = dataSnapshot.getValue(Comment.class); 
    String commentKey = dataSnapshot.getKey(); 

    // ... 
} 

@Override 
public void onChildRemoved(DataSnapshot dataSnapshot) { 
    Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey()); 

    // A comment has changed, use the key to determine if we are displaying this 
    // comment and if so remove it. 
    String commentKey = dataSnapshot.getKey(); 

    // ... 
} 

@Override 
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) { 
    Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey()); 

    // A comment has changed position, use the key to determine if we are 
    // displaying this comment and if so move it. 
    Comment movedComment = dataSnapshot.getValue(Comment.class); 
    String commentKey = dataSnapshot.getKey(); 

    // ... 
} 

@Override 
public void onCancelled(DatabaseError databaseError) { 
    Log.w(TAG, "postComments:onCancelled", databaseError.toException()); 
    Toast.makeText(mContext, "Failed to load comments.", 
      Toast.LENGTH_SHORT).show(); 
} 
}; 
ref.addChildEventListener(childEventListener); 

In einigen Fällen können Sie einen Rückruf einmal aufgerufen werden soll kann und dann sofort entfernt, wenn beispielsweise ein UI-Element zu initialisieren, die Sie nicht erwarten, zu ändern. Sie können die Methode addListenerForSingleValueEvent() verwenden, um dieses Szenario zu vereinfachen: Sie wird einmal ausgelöst und dann nicht erneut ausgelöst.

Dies ist nützlich für Daten, die nur einmal geladen werden müssen und von denen nicht erwartet wird, dass sie sich häufig ändern oder aktiv überwacht werden müssen.Zum Beispiel

Beispiel: -

final String userId = getUid(); 
mDatabase.child("users").child(userId).addListenerForSingleValueEvent(
    new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // Get user value 
      User user = dataSnapshot.getValue(User.class); 

      // ... 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Log.w(TAG, "getUser:onCancelled", databaseError.toException()); 
     } 
    }); 
Verwandte Themen