Firebase调用dataSnapshot.getValue(Event.class)读取ArrayList报错如何解决
问题根因
报错的核心原因是自定义Event类中的userID字段使用了无泛型参数的原生ArrayList类型,Firebase Realtime Database的序列化工具无法自动识别原生集合类的元素类型,因此抛出了要求使用GenericTypeIndicator的异常。
最优解决方案(推荐)
给ArrayList加上明确的泛型参数,你的userID存储的是用户ID字符串,直接指定泛型为String即可,无需额外修改业务调用代码。
修改后的Event.java代码如下:
public class Event { private String name, startDate, endDate, mode; // 给ArrayList加上明确的String泛型 private ArrayList<String> userID; public Event() { userID = new ArrayList<>(); this.name = ""; this.startDate = ""; this.endDate = ""; this.mode = ""; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStartDate() { return startDate; } public void setStartDate(String startDate) { this.startDate = startDate; } public String getEndDate() { return endDate; } public void setEndDate(String endDate) { this.endDate = endDate; } public String getMode() { return mode; } public void setMode(String spinner) { this.mode = spinner; } // getter返回值也加上泛型 public ArrayList<String> getUserID() { return userID; } // setter参数也加上泛型 public void setUserID(ArrayList<String> userID) { this.userID = userID; } }
修改后原来的业务代码Event event = dataSnapshot.getValue(Event.class);可以直接正常运行,无需其他改动。
备选方案(适用于集合泛型为复杂自定义类型的场景)
如果你的userID存储的是复杂自定义对象,或者不想修改Event类结构,可以通过GenericTypeIndicator手动解析集合字段:
for (int a= 0; a<idd.size(); a++){ if (idd.get(a).equals(userId)){ System.out.println("AAAAAAAABBBBBBBBB"); // 先解析除了userID之外的其他字段 Event event = new Event(); event.setName(dataSnapshot.child("name").getValue(String.class)); event.setStartDate(dataSnapshot.child("startDate").getValue(String.class)); event.setEndDate(dataSnapshot.child("endDate").getValue(String.class)); event.setMode(dataSnapshot.child("mode").getValue(String.class)); // 用GenericTypeIndicator解析ArrayList GenericTypeIndicator<ArrayList<String>> t = new GenericTypeIndicator<ArrayList<String>>() {}; ArrayList<String> userIdList = dataSnapshot.child("userID").getValue(t); event.setUserID(userIdList); System.out.println("AAAAA5555555"); list.add(event); } }
注意事项
- Firebase Realtime Database反序列化自定义类时,要求集合类型必须明确指定泛型参数,禁止使用
ArrayList、List这类无泛型的原生集合类型 - 自定义类必须保留公开的无参构造方法,所有需要序列化的字段必须有对应的公开getter、setter方法
内容的提问来源于stack exchange,提问作者Huzaifa
相关产品推荐
相关产品推荐

