【问题标题】:Retrieving data from Firebase Android Studio从 Firebase Android Studio 中检索数据
【发布时间】:2016-07-25 09:50:47
【问题描述】:

我的 Firebase 数据库的结构如下所示:

我想以这样一种方式从中检索数据,即当我更改数据库中“名称”的值时,它会立即在 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) {

        }
    });

【问题讨论】:

  • 显示代码,没有它我们帮不了你
  • @DimaRostopira 我添加了代码。

标签: android firebase firebase-realtime-database


【解决方案1】:

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

【讨论】:

  • @Michal 感谢您的接受,我终于可以为我的问题设置赏金了:D
【解决方案2】:

通过将异步侦听器附加到 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());
        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    相关资源
    最近更新 更多