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

如何通过Model Class为Firestore的ArrayList字段设置默认值并后续更新

解决方案

一、设置optionSkipped的默认值

有两种常用方式可以让Firestore存储默认的[-1,-1,-1,-1]数组:

方式1:修改模型类的构造函数

在无参构造里直接初始化optionSkipped为默认数组,同时给带参构造加兜底逻辑,确保传入null时也能使用默认值:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;

public class PlayerDetails{
    @ServerTimestamp
    Date regDate;
    boolean hasPlayed;
    ArrayList<Integer> optionSkipped;

    // 无参构造初始化默认数组
    PlayerDetails(){
        this.optionSkipped = new ArrayList<>(Arrays.asList(-1, -1, -1, -1));
    }

    PlayerDetails(Date regDate, boolean hasPlayed , ArrayList<Integer> optionSkipped){
        this.regDate = regDate;
        this.hasPlayed = hasPlayed;
        // 传入null时使用默认数组,否则用传入值
        this.optionSkipped = optionSkipped != null ? optionSkipped : new ArrayList<>(Arrays.asList(-1, -1, -1, -1));
    }
}

之后创建对象时,无论用无参构造还是传入null,都会自动带上默认数组:

// 方式A:使用无参构造
PlayerDetails details = new PlayerDetails();
details.hasPlayed = false;

// 方式B:使用带参构造传null,自动触发默认值
PlayerDetails details = new PlayerDetails(null, false, null);

// 插入Firestore
databaserefrence.collection("game")
        .document("game1")
        .set(details)
        .addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                // 处理成功逻辑
            } else {
                // 处理失败逻辑
            }
        });

方式2:创建对象时手动传入默认数组

如果不想修改模型类,可在创建PlayerDetails对象时,直接初始化好默认数组传入:

ArrayList<Integer> defaultOptionSkipped = new ArrayList<>(Arrays.asList(-1, -1, -1, -1));
PlayerDetails details = new PlayerDetails(null, false, defaultOptionSkipped);

databaserefrence.collection("game")
        .document("game1")
        .set(details)
        .addOnCompleteListener(/* 你的回调逻辑 */);

二、更新optionSkipped数组

如果需要将数组更新为[0,0,-1,-1],推荐两种高效方式:

方式1:直接更新单个字段

用update方法单独替换optionSkipped字段,无需修改整个文档:

ArrayList<Integer> updatedOptions = new ArrayList<>(Arrays.asList(0, 0, -1, -1));
databaserefrence.collection("game")
        .document("game1")
        .update("optionSkipped", updatedOptions)
        .addOnCompleteListener(task -> {
            if (task.isSuccessful()) {
                // 更新成功逻辑
            } else {
                // 更新失败,处理异常
            }
        });

方式2:修改对象后合并更新

如果需要同时修改多个字段,可先读取现有文档,修改数组后用SetOptions.merge()做合并更新,避免覆盖其他未修改的字段:

databaserefrence.collection("game")
        .document("game1")
        .get()
        .addOnSuccessListener(documentSnapshot -> {
            if (documentSnapshot.exists()) {
                PlayerDetails details = documentSnapshot.toObject(PlayerDetails.class);
                if (details != null) {
                    // 更新目标数组
                    details.optionSkipped = new ArrayList<>(Arrays.asList(0, 0, -1, -1));
                    // 合并更新,仅修改变化的字段
                    databaserefrence.collection("game")
                            .document("game1")
                            .set(details, SetOptions.merge())
                            .addOnCompleteListener(/* 回调逻辑 */);
                }
            }
        });

内容的提问来源于stack exchange,提问作者Ravi S. Ranjan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:18