无法从Firebase读取列表,预期为Map。

14 浏览
0 Comments

无法从Firebase读取列表,预期为Map。

我想在安卓中将所有Firebase的DataSnapshot子项转换成一个列表。

类似于下面的代码:

mFirebaseRef = new Firebase(FIREBASE_URL);

mFirebaseRef.addValueEventListener(new ValueEventListener() {

@Override

public void onDataChange(DataSnapshot dataSnapshot) {

List td = (ArrayList) dataSnapshot.getValue();

//notifyDataSetChanged();

}

@Override

public void onCancelled(FirebaseError firebaseError) {

}

});

0
0 Comments

问题出现的原因是使用了错误的监听器方法。代码中使用了addValueEventListener()方法来监听数据的改变,而实际上需要使用addListenerForSingleValueEvent()方法来获取数据只需要一次。

解决方法是将addValueEventListener()方法改为addListenerForSingleValueEvent()方法。

修改后的代码如下所示:

Firebase ref = new Firebase(FIREBASE_URL);
  ref.addListenerForSingleValueEvent(new ValueEventListener() {
      public void onDataChange(DataSnapshot snapshot) {
          Log.e("Count " ,""+snapshot.getChildrenCount());
          for (DataSnapshot postSnapshot: snapshot.getChildren()) {
            <YourClass> post = postSnapshot.getValue(<YourClass>.class);
            Log.e("Get Data", post.<YourMethod>());
          }
      }
      public void onCancelled(FirebaseError firebaseError) {
          Log.e("The read failed: " ,firebaseError.getMessage());
      }
  });

这样修改后,就可以正确获取到数据了。

0
0 Comments

问题的原因是数据格式不匹配。Firebase中存储的数据是以Map的形式存储的,而不是List。解决方法是将数据转换为Map类型。

在代码中,可以使用以下方式将数据转换为Map类型:

Map td = (HashMap) dataSnapshot.getValue();

如果想要获取指定节点的父级列表,可以使用以下方式:

Map = (HashMap) dataSnapshot.getValue();

Android Studio在这一行代码上显示红色下划线,并且在堆栈跟踪中报错,原因是无法将集合对象强制转换为列表对象。解决方法是使用以下方式代替:

List values = new ArrayList<>(td.values());

感谢提问者提供的解决方法,使用List values = new ArrayList<>(td.values());是一个很好的解决办法。之前我也遇到了同样的问题。

0
0 Comments

文章内容如下:

在使用Firebase时,当从Firebase中读取数据列表时,可能会遇到一个错误,即“Cannot read list from Firebase, Map expected”。这个错误的出现是因为代码中的数据类型不匹配导致的。

解决这个问题的方法是,将数据类型从列表(List)改为映射(Map)。可以通过以下步骤来解决这个问题:

1. 在Firebase数据库中,将数据的类型更改为映射(Map)。确保数据是按照键值对的形式存储的。

2. 在代码中,将数据类型从列表(List)改为映射(Map)。在上述代码中,可以通过将DataSnapshot对象的getChildren()方法更改为getValue()方法来实现。

修改后的代码如下所示:

FirebaseDatabase mFirebaseDatabase = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = mFirebaseDatabase.getReference(FIREBASE_URL);
databaseReference.addValueEventListener(new ValueEventListener() {
    public void onDataChange(DataSnapshot dataSnapshot) {
        Map dataMap = (Map) dataSnapshot.getValue();
        for (Map.Entry entry : dataMap.entrySet()) {
            String key = entry.getKey();
            Object value = entry.getValue();
            Log.v(TAG, key);
            Log.v(TAG, value.toString());
        }
    }
    public void onCancelled(DatabaseError databaseError) {
    }
});

通过将数据类型从列表(List)改为映射(Map),就可以正确地从Firebase中读取数据,并避免出现“Cannot read list from Firebase, Map expected”错误。

0