无法从Firebase读取列表,预期为Map。
无法从Firebase读取列表,预期为Map。
我想在安卓中将所有Firebase的DataSnapshot子项转换成一个列表。
类似于下面的代码:
mFirebaseRef = new Firebase(FIREBASE_URL);
mFirebaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
List
//notifyDataSetChanged();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
问题出现的原因是使用了错误的监听器方法。代码中使用了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()); } });
这样修改后,就可以正确获取到数据了。
问题的原因是数据格式不匹配。Firebase中存储的数据是以Map的形式存储的,而不是List。解决方法是将数据转换为Map类型。
在代码中,可以使用以下方式将数据转换为Map类型:
Maptd = (HashMap ) dataSnapshot.getValue();
如果想要获取指定节点的父级列表,可以使用以下方式:
Map= (HashMap ) dataSnapshot.getValue();
Android Studio在这一行代码上显示红色下划线,并且在堆栈跟踪中报错,原因是无法将集合对象强制转换为列表对象。解决方法是使用以下方式代替:
List
感谢提问者提供的解决方法,使用List
是一个很好的解决办法。之前我也遇到了同样的问题。
文章内容如下:
在使用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) { MapdataMap = (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”错误。