Firebase Firestore中使用set方法如何避免覆盖原有字段?
解决Firestore添加字段不覆盖原有数据的问题
你遇到的问题是因为Firestore的set()方法默认会替换整个文档,所以原有字段会被清空覆盖。解决这个问题有两种常用方法:
方法1:使用update()方法
update()只会更新你指定的字段,完全不会改动文档里的其他原有字段。但要注意:如果目标文档不存在,update()会抛出错误,所以只适合确定文档已经存在的场景。
修改你的代码如下:
void displayMessage() { List<CheckBoxModel> checked = checkboxes.where((element) => element.value).toList(); String result = ''; checked.forEach((element) { result = result + element.title; }); final sp = context.read<SignInProvider>(); // 替换set为update FirebaseFirestore.instance .collection("users") .doc(sp.uid) .update({ "firstWord": value, "disease": result, }); Navigator.push( context, MaterialPageRoute(builder: (context) => const ChildDetailsScreen()), ); _saveDataFirstWord(value!); } }
方法2:使用set()的merge参数
如果不确定文档是否存在(需要兼容文档不存在时创建的场景),可以给set()传SetOptions(merge: true)参数,这样既会保留原有字段,又能添加/更新新字段,文档不存在时还会自动创建。
修改后的代码:
void displayMessage() { List<CheckBoxModel> checked = checkboxes.where((element) => element.value).toList(); String result = ''; checked.forEach((element) { result = result + element.title; }); final sp = context.read<SignInProvider>(); FirebaseFirestore.instance .collection("users") .doc(sp.uid) .set({ "firstWord": value, "disease": result, }, SetOptions(merge: true)); // 加上merge参数 Navigator.push( context, MaterialPageRoute(builder: (context) => const ChildDetailsScreen()), ); _saveDataFirstWord(value!); } }
另外提个小优化:你拼接result的代码可以简化成一行,更简洁:
String result = checked.map((e) => e.title).join('');
内容的提问来源于stack exchange,提问作者Dasun Dola
相关产品推荐
相关产品推荐

