You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:00:02