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
相关产品推荐
相关产品推荐

