如何将List中全部数据以多Map形式存入单个Firestore文档
问题根因
原代码仅能存储单条数据的核心原因:
setData默认是覆盖写入模式,未开启merge: true时,每次调用都会清空文档原有内容后写入新数据,多次调用仅会保留最后一次写入结果- 用
dataInt作为动态键名时未做处理,Dart会将其识别为固定字符串键名而非变量值,导致写入逻辑不符合预期
按顺序编号存储的实现方案
推荐优先选择「批量组装数据后一次性写入」的方案,性能更稳定,也不会出现写入顺序混乱的问题:
void saveSelectedRoute() async { Map<String, dynamic> routeContent = {}; // 遍历选中站点列表,按列表索引作为编号键 for (int index = 0; index < _selectedBusStop.length; index++) { String stopName = _selectedBusStop[index]; // 替换为你实际查询站点GeoPoint的逻辑 var stopDoc = await Firestore.instance.collection("你的站点集合名").document(stopName).get(); GeoPoint location = stopDoc.data["location"]; routeContent[index.toString()] = { "Lat": location.latitude, "Lng": location.longitude }; } // 一次性写入所有数据到目标文档 await Firestore.instance.collection("routes").document(inputName).setData(routeContent); }
如果要保留原有的initRoute循环调用写法,只需要修改两处即可:
void initRoute(data, int dataInt) async{ Firestore.instance.collection('routes').document(inputName).setData({ // 变量作为键名需要放在方括号内,转字符串避免类型问题 dataInt.toString(): { "Lat" : data['location'].latitude, "Lng" : data['location'].longitude } // 开启merge模式,新数据合并到原有文档中不覆盖 }, merge: true); }
现有实现注意事项
你目前使用站点名作为键名加merge: true的方案已经可以实现全量写入,但存在两个限制:
- 键名为站点名称,无法直接对应你最初要求的选择顺序编号,后续生成Polyline时需要自行排序
- 每次写入都是独立网络请求,站点数量较多时会增加请求耗时和失败概率,建议优先用批量写入方案
内容的提问来源于stack exchange,提问作者randomstudent
相关产品推荐
相关产品推荐

