gpt4 book ai didi

java - 为什么即使元素未插入到 Firestore 文档中的数组中,也会调用 successListener?

转载 作者:搜寻专家 更新时间:2023-11-01 03:15:11 25 4
gpt4 key购买 nike

我使用以下代码将 userId 添加到 Cloud Firestore 文档中的数组:

DocumentReference reference = firebaseFirestore.collection("photos").document(photoId);
reference.update("views", FieldValue.arrayUnion(currentUser.getUid()))
.addOnSuccessListener(new OnSuccessListener<Void>()
{
@Override
public void onSuccess(Void aVoid)
{
reference.update("viewsCount", FieldValue.increment(1));
}
});

正如您从代码中看到的,我希望 viewsCount 仅在将元素添加到 views 数组时递增。

根据这个Adding Data document,arrayUnion() 将元素添加到数组,但只添加不存在的元素,而这正是我想要的。

但是,问题是当我将一个已经存在的元素添加到数组中时,该元素没有被插入,而是调用了 addOnSuccessListenerviewsCount 是递增并且永远不会调用 failureListener。 有什么办法可以防止这种情况发生吗?我希望 viewsCount 仅在将元素插入 views 数组时递增。

最佳答案

But, the problem is that when I add an already present element into the array, the element is not inserted, but addOnSuccessListener is called, viewsCount is incremented and failureListener is never called.

这是正常行为。请注意,只有当特定操作的最终结果成功时,才会为您在数据库中执行的操作调用您当前使用的 OnSuccessListener

在您的特定情况下:

.update("views", FieldValue.arrayUnion(currentUser.getUid())

OnSuccessListener 在将 uid 添加到您的 views 数组的操作成功后调用。 uid 是否已经存在并不重要,整个操作成功了。 uid 确实没有添加到数组中,但尽管如此,操作还是成功的。

另请记住,当任务所代表的工作按预期完成且没有错误时,该任务被视为成功。另一方面,OnFailureListener 在任务因异常而失败时被调用。所以它可以是结果或异常,永远不会两者兼而有之。因此,添加一个已经存在于数组中的 uid 永远不会被视为失败。

要解决这个问题,您应该创建一个 get() 调用,获取整个文档并检查 views 中是否存在 uid大批。如果不存在,则创建更新并递增计数器,否则不采取任何操作。

关于java - 为什么即使元素未插入到 Firestore 文档中的数组中,也会调用 successListener?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58281971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com