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

FireStore添加新玩家字段时误删已有数据问题求助

FireStore添加玩家时覆盖已有数据的解决方法

问题说明

在校园FireStore项目中,需要向game/Players文档逐个添加player1、player2、player3、player4字段。当前问题是:第一个用户运行代码成功添加player1,但第二个用户添加player2时,player1会被删除,后续玩家添加时均出现类似覆盖原有数据的情况。代码逻辑期望检查已有玩家后添加新字段,但未编写删除逻辑却出现数据丢失。

问题代码

public void initPlayer(){
        getFirestore();

        HashMap<String, String> playerQuote = new HashMap<>();
        HashMap<String, HashMap<String, String>> players = new HashMap<>();

        playerQuote.put("money", "140");
        playerQuote.put("name", ControllerManager.getPlayer().getPlayerID().toString());
//The PlayerID is different for every player
        playerQuote.put("color", "Green");

        playerQuote.put("haan", "0");
        playerQuote.put("gans", "0");
        playerQuote.put("kat", "0");
        playerQuote.put("hond", "0");
        playerQuote.put("schaap", "0");
        playerQuote.put("bok", "0");
        playerQuote.put("ezel", "0");
        playerQuote.put("varken", "0");
        playerQuote.put("koe", "0");
        playerQuote.put("paard", "0");


        players.put((ControllerManager.getPlayer().getPlayerID()), playerQuote);
        this.db.collection("game")
                .document("Players")
                .set(players);

    }

问题原因

代码中使用了FireStore的set()方法,该方法默认会替换整个目标文档。每次调用时,你创建的players HashMap只包含当前玩家的数据,执行set()后,文档会被完全替换成这个新的HashMap,导致之前的玩家数据被覆盖。

解决方案

有两种方式可以实现“添加新玩家字段且保留原有数据”:

方式1:使用update()方法

update()方法只会更新指定的字段,不会影响文档中已存在的其他字段:

public void initPlayer(){
        getFirestore();

        HashMap<String, String> playerQuote = new HashMap<>();

        playerQuote.put("money", "140");
        playerQuote.put("name", ControllerManager.getPlayer().getPlayerID().toString());
        playerQuote.put("color", "Green");

        playerQuote.put("haan", "0");
        playerQuote.put("gans", "0");
        playerQuote.put("kat", "0");
        playerQuote.put("hond", "0");
        playerQuote.put("schaap", "0");
        playerQuote.put("bok", "0");
        playerQuote.put("ezel", "0");
        playerQuote.put("varken", "0");
        playerQuote.put("koe", "0");
        playerQuote.put("paard", "0");

        // 直接用update更新指定玩家字段
        this.db.collection("game")
                .document("Players")
                .update(ControllerManager.getPlayer().getPlayerID(), playerQuote);
    }

方式2:给set()方法添加merge选项

通过SetOptions.merge()参数,让set()方法只合并新字段,不替换整个文档:

public void initPlayer(){
        getFirestore();

        HashMap<String, String> playerQuote = new HashMap<>();
        HashMap<String, HashMap<String, String>> players = new HashMap<>();

        playerQuote.put("money", "140");
        playerQuote.put("name", ControllerManager.getPlayer().getPlayerID().toString());
        playerQuote.put("color", "Green");

        playerQuote.put("haan", "0");
        playerQuote.put("gans", "0");
        playerQuote.put("kat", "0");
        playerQuote.put("hond", "0");
        playerQuote.put("schaap", "0");
        playerQuote.put("bok", "0");
        playerQuote.put("ezel", "0");
        playerQuote.put("varken", "0");
        playerQuote.put("koe", "0");
        playerQuote.put("paard", "0");


        players.put((ControllerManager.getPlayer().getPlayerID()), playerQuote);
        this.db.collection("game")
                .document("Players")
                .set(players, SetOptions.merge()); // 添加merge选项

    }

预期效果

文档game/Players中会保留所有已添加的player字段,每个player下包含对应的属性数据,不会出现覆盖丢失的情况。

内容的提问来源于stack exchange,提问作者Tanguy Breton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 13:42:49