【问题标题】:Loop to add docs to Google Firestore循环将文档添加到 Google Firestore
【发布时间】:2021-12-27 15:17:53
【问题描述】:

我正在尝试遍历 List 以将每个项目添加到 google firestore doc。但是,我面临的问题是只有List 中的最后一项被添加到文档中

注意:print("=== $i POST SUCCESSFULLY ADDED ====") 行按预期打印增量 5 次

问题:如何让这个循环将所有项目添加到 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++;
    }
  }

【问题讨论】:

    标签: android flutter dart


    【解决方案1】:

    我不完全知道您的问题出在哪里,但您的代码似乎忽略了将数据 POST 到服务器是 asynchronous 操作这一事实。

    换句话说,我希望您需要await 来实现。

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

    你的代码应该是这样的:

    Future<void> 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
        }
      }
    

    【讨论】:

    • 因为在set() 之后没有任何事情发生,所以不需要使用带有awaitasync 函数。并且还因为使用同步调用将项目写入数据库的顺序并不重要。唯一的问题是打印语句中的信息是错误的,因为此时该项目尚未完成对数据库的写入。我们也不知道操作是否成功。
    • 确实如此。愿意分享更多上下文或代码,以便我研究它吗?
    • 我不确定您到底想知道什么,但请参阅下面的答案以获取原始问题的更多信息。我希望这会有所帮助。
    【解决方案2】:

    事实上,所有项目都写入文档,但您不断覆盖文档,下一个项目仅以最后一个项目结束。

    调用set() 时,您应该使用SetOptionsmerge 设置为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。

    进一步阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 2022-10-09
      • 1970-01-01
      • 2018-12-22
      • 2020-04-25
      相关资源
      最近更新 更多