从Firebase获取数据至RecyclerView时应用崩溃问题求助
最近开发一款支持用户撰写笔记的应用时踩了个实打实的坑:明明已经把笔记成功存入Firebase了,结果打开帖子页面时应用直接崩溃,RecyclerView还显示为空。折腾了好半天试了各种方法都没搞定,最后终于找到根源,分享给大家避避坑。
我尝试过的无效解决方案
- 将RecyclerView的高度设置为
wrap_content - 在适配器中调用
notifyDataSetChanged()强制刷新数据 - 确保调用了FirebaseRecyclerAdapter的
startListening()方法
问题根源与最终解决办法
反复排查后发现,问题出在Firebase存储的timestamp字段类型和Model类中的定义不匹配:我在数据库里存的timestamp是字符串格式,但Model类里把它定义成了long类型,Firebase在解析数据时无法将String转为long,直接引发崩溃,自然导致RecyclerView拿不到数据展示。
解决办法超简单:把Model类中的timestamp字段类型改成String,同时存入Firebase时也保持String格式,问题瞬间就解决了!
相关代码对比
有问题的Model类(导致崩溃)
public class Note { private String title; private long timestamp; // 类型与数据库存储格式不匹配 // Firebase解析必需的空构造函数 public Note() {} public Note(String title, long timestamp) { this.title = title; this.timestamp = timestamp; } // Getter和Setter方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public long getTimestamp() { return timestamp; } public void setTimestamp(long timestamp) { this.timestamp = timestamp; } }
修改后的Model类(解决问题)
public class Note { private String title; private String timestamp; // 改为String类型,与数据库存储格式匹配 public Note() {} public Note(String title, String timestamp) { this.title = title; this.timestamp = timestamp; } // Getter和Setter方法 public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } }
对应的Logcat错误信息(供参考)
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.mynotesapp, PID: 8976
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.String to long
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertLong(CustomClassMapper.java:445)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToPrimitive(CustomClassMapper.java:286)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:215)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
...
内容的提问来源于stack exchange,提问作者willie wonka

