繁体   English   中英

Firestore 文档更新失败

[英]Firestore document update is failing

我在 firestore 中有我正在尝试更新的文档。 这些更新对老用户来说是成功的,但对新用户来说是失败的。 我有列表视图,用户可以在其中查看所有添加的文档。 他们单击“编辑”,然后导航到详细的文档视图,他们可以在其中进行更改和保存。

我收到的错误

[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: 
[cloud_firestore/not-found] Some requested document was not found.

我正在将文档 ID 从列表视图传递到单个文档编辑视图;

data: docId

在编辑页面中,我正在加载来自上一页的用户 ID 和文档 ID。

class Edit extends StatefulWidget {
 final DataModel data;

 Edit({required this.data});
String ui = FirebaseAuth.instance.currentUser!.uid;

@override
_EditState createState() => _EditState();
}

在保存按钮上,我正在使用以下内容更新 firestore;

ElevatedButton.styleFrom(primary: Colors.redAccent),
                  onPressed: () async {
                    DocumentReference edit = FirebaseFirestore
                        .instance
                        .collection('edit')
                        .doc(ui)
                        .collection('edit')
                        .doc(widget.data.documentId);

            edit.update({ 
                 
                    });

cloud_firestore/not-found错误意味着在指定的 id 下找不到文档。 请确保该 ID 确实存在于您的数据库中。

如果您使用的是本地模拟器,请确保您正在访问正确的数据库。

如果您使用的是持久存储(离线 firestore 数据),则可能是它仍然有旧数据,或者您的设备没有连接到 inte.net,因此没有当前数据。

错误消息告诉您找不到要更新的引用的文档。 有几种方法可以将数据更新到 Cloud Firestore:

  • 更新- 更改已存在文档的字段。 如果文档不存在则失败。
  • set - 覆盖文档中的数据,如果文档不存在则创建该文档。 如果您只想部分更新文档,请使用 SetOptions.merge()。 如果您希望能够在文档不存在时创建它,或者在它已经存在时更新它,您应该将 SetOptions.merge 作为第二个参数传递,如 API 文档中所述。

所以你只需要为你的用例使用正确的操作。

  • 如果您想在不知道文档是否存在的情况下更新文档,则需要像这样使用带有 merge() 选项的 set()(此示例适用于 Java):

    // 更新一个字段,如果文档不存在则创建该文档。

     Map<String, Object> data = new HashMap<>(); data.put("capital", true); db.collection("cities").document("BJ").set(data, SetOptions.merge());
  • 使用 auth.currentUser 时的另一个经典问题是 Auth object 可能未完全初始化,因此 auth.currentUser.uid 为 null。如文档中所述,您应该使用 onAuthStateChanged() 观察器或检查auth.currentUser 不是 null。

尝试:

    ElevatedButton.styleFrom(primary: Colors.redAccent),
     onPressed: () 
    async {
     DocumentReference edit = FirebaseFirestore .instance .collection('edit') .doc(FirebaseAuth.instance.currentUser.uid) .collection('edit') .doc(widget.data.documentId); 
edit.update({ });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM