首页 > 解决方案 > java.util.HashMap 无法强制转换(android studio、firebase、java)

问题描述

我的 firebase-realtime-database 映像

我在上一个部分(Java 和 Firebase)上被困了两天。

我在数据库中保留了一个类类型列表,但是当我尝试将其发送到 Firebase 时出现错误。

这是代码:

ArrayList<PostDetails_class> cPostList=new ArrayList<PostDetails_class>();
FirebaseDatabase.getInstance().getReference().addValueEventListener( new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot snapshot) {
              cPostList= (ArrayList<PostDetails_class>) snapshot.child( "application_details" ).child( "community_postsList" ).getValue();
          }
          @Override
          public void onCancelled(@NonNull DatabaseError error) {

          }
      } );

这是从“cPost_List”列表中读取数据的尝试,该列表是从“PostDetails_class”类构建的列表。(“community_postsList”是“PostDetails_class”类的子列表):

PostDetails_class postDetails_class=cPostList.get( 0 );  //line 123 in main activity

错误:

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapp, PID: 1938
    java.lang.ClassCastException: java.util.HashMap cannot be cast to com.example.myapp.PostDetails_class
        at com.example.myapp.MainActivity.makeList(MainActivity.java:123)

标签: javaandroidfirebasefirebase-realtime-database

解决方案


当您在getValue()不传递任何参数的情况下调用时,Firebase 会返回数据的本机类型,在本例中为Map<String, Object>.

您需要通过在对 的调用中指定要返回的类来告诉 Firebase 要返回的类getValue,例如:getValue(PostDetails_class.class)


Firebase 无法按照您要求的方式返回通用列表,因为返回了列表的类型。我通常更喜欢循环子节点,并一一提取它们:

ArrayList<PostDetails_class> cPostList=new ArrayList<PostDetails_class>();
FirebaseDatabase.getInstance().getReference("application_details/community_postsList").addValueEventListener( new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot child: snapshot.getChildren()) {
            PostDetails_class value = child.getValue(PostDetails_class.class);
            cPostList.add(value);
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        throw error.toException();
    }
});

您会注意到我还更改了代码以从更深的节点加载数据,而不是加载整个数据库。


如果您想一次性获取整个列表,这是可能的,但您需要为列表提供一个通用类型指示符。我建议在有关 [ firebase-realtime-database][android] generictypeindicator的这些问题中阅读更多内容。


推荐阅读