循环添加文档到 Google Firestore
循环添加文档到 Google Firestore
我试图循环遍历一个 列表
,将每个项目添加到一个 谷歌firestore文档
中。然而,我面临的问题是,只有列表
中的最后一个项目被添加到文档中。
注意:行print(\"=== $i POST SUCCESSFULLY ADDED ====\")
按预期逐渐增加5次。
QUESTION: 如何让这个循环将所有项目添加到firestore文档中?
void addPost() { DocumentReference documentReferencer = _firestore.collection('posts').doc(); var i = 0; while (i < 5) { documentReferencer.set(postsData[i]); print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES i++; } }
admin 更改状态以发布 2023年5月22日
实际上,所有的项目都写入了文档,但是您仍然用下一个项目覆盖了文档,最终只剩下最后一个项目。
当调用set()
时,您应该使用SetOptions
来将merge
设置为true
。
void addPost() { DocumentReference documentReferencer = _firestore.collection('posts').doc(); var i = 0; while (i < 5) { documentReferencer.set(postsData[i], SetOptions(merge: true)); print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES i++; } }
或者使用update()
。注意:如果文档尚不存在,则此操作将失败。
void addPost() { DocumentReference documentReferencer = _firestore.collection('posts').doc(); var i = 0; while (i < 5) { documentReferencer.update(postsData[i]); print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES i++; } }
我建议您在调试代码的同时逐步检查数据库。然后您就可以看到如何一直在覆盖文档。
请注意,如果数据库调用出现错误,您没有捕获任何错误。因此,您无法确定操作是否成功。在您的print()
时,您只知道将请求发送到Firebase。
进一步阅读:
- Firebase文档:将数据添加到Cloud Firestore
- Flutter Firebase文档:用法-写入数据
- Stack Overflow:set与{merge: true}和update之间的区别
我不确切知道你在这里遇到了什么问题,但看起来你的代码忽略了将数据 POST 到服务器是一种异步操作的事实。
换句话说,我希望你需要等待它发生。
另外,我会重构循环以提高可读性。
你的代码应该是这样的:
FutureaddPost() async { DocumentReference documentReferencer = _firestore.collection('posts').doc(); for(final post in postsData) { await documentReferencer.set(post); print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES } }