2016-07-25 99 views
2

我的火力地堡数据库建设的结构检索数据看起来像这样:从火力地堡的Android工作室

enter image description here

我想以这样的方式来从中检索数据,当我改变“名称”的价值数据库会在Android Studio中立即更改。现在,我使用.addChildEventListner方法结合Map<String, String>。有人能帮助我吗?

编辑:我的代码:

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

显示代码,我们不能帮你没有它 –

+0

@DimaRostopira我添加的代码。 – Michal

回答

1

在您的活动创建空HashMap Hasmap<String, Marker> markers = new Hashmap<>(); 然后在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); 

而且在onChildChanged

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

最后在onChildRemo ved

markers.get(dataSnapshot.getKey()).remove(); 
markers.remove(dataSnapshot.getKey()); 
+0

非常感谢。一切都很好。 :) – Michal

+0

@Michal谢谢接受,我终于可以为我的问题设置赏金:D –

1

通过将异步侦听器附加到FirebaseDatabase引用来检索Firebase数据。对于数据的初始状态,监听器被触发一次,并且在数据发生任何变化时再次触发监听器。

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

要添加的值事件侦听器,使用addValueEventListener()或addListenerForSingleValueEvent()方法。要添加子事件侦听器,请使用addChildEventListener()方法。

可以使用onDataChange()方法读取给定路径上内容的静态快照,因为它们在事件发生时存在。该方法在监听器连接时触发一次,并且每次数据(包括子节点)都会更改。事件回调会传递包含该位置所有数据的快照,包括子数据。如果没有数据,则返回的快照为空。

实施例: -

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); 

儿童事件响应于发生从操作的节点的子节点的特定操作触发例如一个新的孩子通过push()方法增加或一个孩子是通过updateChildren()方法更新。它们中的每一个都可以用于监听数据库中特定节点的更改。

例子: -

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); 

在某些情况下,你可能需要一个回调被调用一次,然后立即删除,例如初始化,你不要指望改变UI元素时。您可以使用addListenerForSingleValueEvent()方法来简化此方案:它触发一次,然后不再触发。

这对于只需要加载一次而且预计不会频繁更改或需要主动侦听的数据很有用。例如,

例子: -

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()); 
     } 
    });