输入 OnDataChange FireBase Android 时应用程序崩溃

Posted

技术标签:

【中文标题】输入 OnDataChange FireBase Android 时应用程序崩溃【英文标题】:App Crashes when enter OnDataChange FireBase Android 【发布时间】:2016-01-14 17:14:24 【问题描述】:

当我尝试将 DataSnapshot 转换为 Hashmap 时出现错误。

private void ponerCasoEnLista()



        final ArrayList<DatosCaso> datos = new ArrayList<>();
        RUTA_DB.child("casos").addValueEventListener(new ValueEventListener() 

            @Override
            public void onDataChange(DataSnapshot snapshot) 
                HashMap<String, String> casos = (HashMap<String, String>) snapshot.getValue();
                for (Object caso : casos.values()) 
                    HashMap<String, Object> casoMap = (HashMap<String, Object>) caso;
                    DatosCaso nuevosdatos = new DatosCaso((String) casoMap.get("nombre"), (String) casoMap.get("color"));
                    datos.add(nuevosdatos);
                    Log.d("NUEVOCASO", "Agrego caso al array");

                   /* if (!userInfoList.contains(userNumber)) 
                        String name = (String) userMap.remove("username");
                        String pic = (String) userMap.remove("profile_picture");
                        UserInfo info = new UserInfo(userNumber, name, pic);
                        userInfoList.add(info);
                    */
                
                // thread executing here can get info from database and make subsequent call
                Collections.addAll(datos);
                ponerCasoEnListview(datos);
            

我明白了:

10-16 00:30:22.951 15066-15066/? E/androidRuntime: FATAL EXCEPTION: main 进程:com.example.gasti.escribocaso1510,PID:15066 java.lang.ClassCastException:java.lang.Long 无法转换为 java.util.HashMap 在 com.example.gasti.escribocaso1510.ActividadPrincipal$2.onDataChange(ActividadPrincipal.java:109)

在 OnDataChange 之后的这一行中:

HashMap<String, String> casos = (HashMap<String, String>) snapshot.getValue();

【问题讨论】:

以下可能的答案。如果不是这样,请编辑您的问题以包含 JSON 的 sn-p。 【参考方案1】:

要转换为 HashMap,只需使用

        @Override
        public void onDataChange(DataSnapshot dataSnapshot)
           Map<String, Object> objectMap = (HashMap<String, Object>) dataSnapshot.getValue();
            Log.e("***", "onDataChange -> " + objectMap.toString());
        

【讨论】:

【参考方案2】:

没有看到你的数据结构就不可能确定,但​​我猜casos 是多个caso 对象的列表。

在这种情况下:

public void onDataChange(DataSnapshot snapshot) 
    for (Object caso : casos.values()) 
        HashMap<String, Object> casoMap = (HashMap<String, Object>) caso;
        DatosCaso nuevosdatos = new DatosCaso((String) casoMap.get("nombre"), (String) casoMap.get("color"));

您应该认真考虑为 DatosCaso 创建一个 JavaBean 对象:

public class DatosCaso 
  String nombre;
  String color;
  public DatosCaso() 
  public String getNombre()  return nombre; 
  public String getColor()  return color; 

这可以让你绕过HashMap:

DatosCaso nuevosdatos = caso.getValue(DatosCaso.class);

【讨论】:

以上是关于输入 OnDataChange FireBase Android 时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥触发 Firebase onDataChange() 方法后,我的 Google Map 会不断创建新的地图实例?

Firebase onDataChange Listener 是不是总是在应用程序关闭后自动删除?或者,不是而且账单也在增加?

使用 Firebase 实时数据库参考填充 RecyclerView

如何等到从 Firebase 检索到我的数据? [复制]

在Android中等待Firebase异步检索数据

仅向firebase中的一个用户发送通知[关闭]