【问题标题】:App Crashes when enter OnDataChange FireBase Android输入 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。

标签: java android hashmap firebase


【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2017-11-03
      • 1970-01-01
      相关资源
      最近更新 更多