Firestore SetOptions.mergeFields()使用POJO无法按预期工作

时间:2018-03-19 10:46:42

标签: android google-cloud-firestore

我正在尝试使用POJO更新文档中的特定字段,如doc中所述。我可以使用SetOptions.mergeFields()。但它正在使用null更新其他字段,而不是保持其他字段(从mergeFields中排除)不变。这是打算吗?

这是我的代码:

UserModel userModel = new UserModel();
userModel.setStatus(0);
setTask = documentReferenceToUse.set(userModel, SetOptions.mergeFields("status"));

setTask.addOnSuccessListener(new OnSuccessListener<Void>()
{
    @Override
    public void onSuccess(Void aVoid)
    {
        if (!emitter.isDisposed())
        {
            emitter.onComplete();
        }
    }
}).addOnFailureListener(new OnFailureListener()
{
    @Override
    public void onFailure(@NonNull Exception e)
    {
        if (!emitter.isDisposed())
        {
            emitter.onError(e);
        }
    }
});

这是我的文档结构: document structure

[解决] 原来这个问题来自我的Firebase封装代码。因此Firebase SDL方面没有实际问题。

1 个答案:

答案 0 :(得分:1)

编辑:仔细查看代码后,我发现您需要更改此行代码:

setTask = documentReferenceToUse.set(model, SetOptions.mergeFields("status"));

使用:

setTask = documentReferenceToUse.set(userModel, SetOptions.mergeFields("status"));

您作为第一个参数传递,而不是您刚创建的对象而是另一个。因此,必须使用的正确对象是:userModel

您还可以通过从数据库中获取整个对象来使用其他方法。拥有该对象后,您可以使用setter来更改其下面的fileds的值。使用setter后,可以直接在引用上使用set()方法将对象添加到数据库中。

documentReferenceToUse.set(userModelFromDatabase);

您还可以使用Map进行更新:

Map<String, Object> map = new HashMap<>();
map.put("status", 0);
documentReferenceToUse.update(map);