Firestore - 对文档使用更新方法,但使用对象(Java)

Posted

技术标签:

【中文标题】Firestore - 对文档使用更新方法,但使用对象(Java)【英文标题】:Firestore - Use update method for document but with Object (Java) 【发布时间】:2020-11-14 12:51:51 【问题描述】:

我想用我拥有的 User 对象更新一个文档,但如果该文档不存在,我不想创建它,因此我不能使用“DocumentReference.set”使用“SetOptions.Merge()”(据我了解)。

但是,根据这篇文章 (Difference between set with merge: true and update),“更新”实际上是我需要的命令。我的问题是,似乎 update 不接受 Java 对象。

我不想自己检查文档是否存在,因为这会导致不必要的读取。

有没有办法解决这个问题?

这是我的代码(为简单起见,我删除了成功和失败监听器):

    public void saveUser(User user)
    
        CollectionReference collection = db.collection("users");

        String id = user.getId();
        if (id.equals(""))
        
            collection.add(user);
        
        else
        
            // I need to ensure that the ID variable for my user corresponds
            // with an existing ID, as I do not want a new ID to be generated by 
            // my Java code (all IDs should be generated by Firestore auto-ID)
            collection.document(ID).set(user);
        
    

【问题讨论】:

请编辑问题以显示您正在使用的代码以及您要更新的文档数据。很难理解你想要做什么。 @DougStevenson 按要求完成 听起来你有两个不同的问题。一个是如果你手头有一个对象,如何更新。另一个是如果文档不存在该怎么办。我将在我的回答中解决这两个问题。今后,请确保您的问题一次解决一个问题。 【参考方案1】:

听起来像你:

    想要更新现有文档 不确定它是否已经存在 不愿意阅读文档以查看它是否存在

如果是这种情况,只需调用update() 并在文档不存在时让它失败。它不会使您的应用程序崩溃。只需将错误侦听器附加到它返回的任务,然后决定如果它失败了你想做什么。

但是,您需要构建一个包含字段和值的 Map 以使用您拥有的源对象进行更新。没有解决方法。

【讨论】:

以上是关于Firestore - 对文档使用更新方法,但使用对象(Java)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地缓存并仅使用 Firestore 更新更改的文档?

使用 Firestore 进行多路径更新

如何更新单个 Firebase Firestore 文档

可以在 arrayUnion 方法中传递 Firestore DocumentReference 吗?

使用云功能更新 Firestore 文档

使用 geofirestore 添加、设置、更新文档