循环添加文档到 Google Firestore

6 浏览
0 Comments

循环添加文档到 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日
0
0 Comments

实际上,所有的项目都写入了文档,但是您仍然用下一个项目覆盖了文档,最终只剩下最后一个项目。

当调用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。

进一步阅读:

0
0 Comments

我不确切知道你在这里遇到了什么问题,但看起来你的代码忽略了将数据 POST 到服务器是一种异步操作的事实。

换句话说,我希望你需要等待它发生。

另外,我会重构循环以提高可读性。

你的代码应该是这样的:

Future addPost() async {
    DocumentReference documentReferencer = _firestore.collection('posts').doc();
    for(final post in postsData) {
      await documentReferencer.set(post);
      print("=== $i POST SUCCESSFULLY ADDED ===="); //PRINTS 5 TIMES
    }
  }

0