Firebase数据库存储自定义Person对象时出现NaN错误求助
解决Firebase存储自定义Person对象时的NaN错误
看起来你在把自定义的Person对象存入Firebase Realtime Database时碰到了NaN相关的报错,我来帮你梳理下最可能的问题和解决办法!
从你给出的代码片段来看,有几个关键点很可能导致这个问题:
1. Firebase不支持序列化android.media.Image类型
你的Person类里定义了private Image personImage;,但Firebase Realtime Database只能处理基本数据类型、String、List、Map,或者符合规范的自定义POJO,像Image这种Android本地的对象,Firebase不知道怎么把它序列化为数据库能存储的格式,这大概率是触发NaN错误的元凶。
2. 自定义POJO不符合Firebase的序列化要求
即使类型没问题,Firebase对POJO还有两个硬性要求:
- 必须有无参的默认构造器,不然Firebase无法在读取数据时实例化对象
- 所有需要序列化的字段都要有对应的
getter和setter方法,Firebase依赖这些方法来访问字段值
具体解决方案
替换不支持的Image类型
不要直接存储Image对象,改成存储图片的URL(String类型):
- 把图片上传到Firebase Storage,获取到图片的下载URL
- 把这个URL存在
Person对象里,后续需要显示图片时,通过这个URL加载即可
修正Person类的结构
下面是调整后的示例代码,满足Firebase的序列化要求:
package HelperObjects; import com.google.android.gms.maps.model.LatLng; import com.google.firebase.database.IgnoreExtraProperties; import java.util.ArrayList; import java.util.List; @IgnoreExtraProperties public class Person { private String name; // 用String存储图片的下载URL,替代原来的Image对象 private String personImageUrl; // 补全你之前截断的字段,这里假设是id private String id; private LatLng location; private List<String> friends; // 必须的无参构造器,Firebase序列化时需要 public Person() {} // 带参数的构造器,方便快速创建Person对象 public Person(String name, String personImageUrl, String id, LatLng location, List<String> friends) { this.name = name; this.personImageUrl = personImageUrl; this.id = id; this.location = location; this.friends = friends; } // 所有字段的getter和setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPersonImageUrl() { return personImageUrl; } public void setPersonImageUrl(String personImageUrl) { this.personImageUrl = personImageUrl; } public String getId() { return id; } public void setId(String id) { this.id = id; } public LatLng getLocation() { return location; } public void setLocation(LatLng location) { this.location = location; } public List<String> getFriends() { return friends; } public void setFriends(List<String> friends) { this.friends = friends; } }
额外检查
如果调整后还是有问题,再检查下其他字段:
- 有没有其他Android特有的对象(比如Bitmap、Drawable),这些都要换成Firebase支持的类型
- 数值类型的字段有没有不小心被赋值为NaN(比如double类型的字段,不要设置成
Double.NaN)
内容的提问来源于stack exchange,提问作者DsCpp
相关产品推荐
相关产品推荐

