如何在设置操作中使用arrayUnion

问题描述 投票:1回答:1

我正在尝试在FieldValue.arrayUnion()上执行set(),但是它抛出异常。我使用的是set而不是update,因为我希望它创建不存在的文档。

代码(在我的情况下为Batch Write,但我认为原理相同)

WriteBatch batch = db.batch();
MyModel myModel = new MyModel("rwTEPzn9vjyhZCZxFeq8", "Mangesh"); // sample data
batch.set(docRef, FieldValue.arrayUnion(myModel), SetOptions.mergeFields("items"));  // throws exception

堆栈跟踪:

W/System.err: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.firestore.v1.Value$ValueTypeCase com.google.firestore.v1.Value.getValueTypeCase()' on a null object reference
W/System.err:     at com.google.firebase.firestore.UserDataReader.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@21.4.2:233)
W/System.err:     at com.google.firebase.firestore.UserDataReader.parseMergeData(com.google.firebase:firebase-firestore@@21.4.2:87)
W/System.err:     at com.google.firebase.firestore.WriteBatch.set(com.google.firebase:firebase-firestore@@21.4.2:89)
W/System.err:     at com.abc.AbcActivity.addTrans(AbcActivity.java:604)
W/System.err:     at com.abc.AbcActivity.validateInputs(AbcActivity.java:571)
W/System.err:     at com.abc.AbcActivity.onAddRecord(AbcActivity.java:260)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at android.view.View$DeclaredOnClickListener.onClick(View.java:5989)
W/System.err:     at android.view.View.performClick(View.java:7140)
W/System.err:     at android.view.View.performClickInternal(View.java:7117)
W/System.err:     at android.view.View.access$3500(View.java:801)
W/System.err:     at android.view.View$PerformClick.run(View.java:27351)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:883)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:100)
W/System.err:     at android.os.Looper.loop(Looper.java:214)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:7356)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

UPDATE 1:MyModel是一个非常简单的POJO类,带有几个字符串。

public class MyModel {
    private String id, name;

    public MyModel (String id, String name) {
        this.id = id;
        this.name = name;
    }

    @PropertyName("id")
    public String getId() {
        return id;
    }

    @PropertyName("id")
    public void setId(String id) {
        this.id = id;
    }

    @PropertyName("name")
    public String getName() {
        return name;
    }

    @PropertyName("name")
    public void setName(String name) {
        this.name= name;
    }
}

UPDATE 2:也会为Stringint值引发异常。也就是说,FieldValue.arrayUnion("abc")FieldValue.arrayUnion(1)均无效。在arrayRemove()的情况下,我也观察到了相同的行为。

UPDATE 3:这是我的数据库的屏幕截图。

DB

UPDATE 4:我直接在文档上测试了set之外的batch。它失败。请注意,在执行此操作之前先清空items,以避免发生任何与类型相关的冲突。

docRef.set(FieldValue.arrayUnion("abc"), SetOptions.mergeFields("items"));

尽管文档说:“返回arrayUnionarrayRemove可以使用的特殊值,但似乎无法将setset()update()一起使用”

java android firebase google-cloud-firestore
1个回答
0
投票

这些方法调用都不起作用,因为您的items数组包含MyModel对象,而不包含字符串或数字。我能想到的最简单的方法是get that array as a list of MyModel objects (List<MyModel>)并根据您的需要删除/添加元素。

请注意,为了从数组中删除整个对象,应该将整个对象传递给该方法,其中所有字段不仅是部分数据。

© www.soinside.com 2019 - 2024. All rights reserved.