如何通过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
相关产品推荐
相关产品推荐

