从Firebase Android Studio检索数据

时间:2016-07-25 09:50:47

标签: android firebase firebase-realtime-database

我的Firebase Datebase的结构如下所示:

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

        }
    });

2 个答案:

答案 0 :(得分:2)

在您的活动中创建空的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

最后在onChildRemoved

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

答案 1 :(得分: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());
        }
    });