【发布时间】:2020-06-02 18:02:37
【问题描述】:
我正在尝试在set() 上执行FieldValue.arrayUnion(),但它会引发异常。我使用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)
更新 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;
}
}
更新 2:String 和 int 值也会引发异常。也就是说,FieldValue.arrayUnion("abc") 和 FieldValue.arrayUnion(1) 都不起作用。在arrayRemove() 的情况下,我也观察到了相同的行为。
更新 3:这是我的数据库的屏幕截图。
更新 4: 我在 batch 之外直接在文档上测试了 set。它失败。请注意,items 在执行此操作之前已清空,以避免任何与类型相关的冲突。
docRef.set(FieldValue.arrayUnion("abc"), SetOptions.mergeFields("items"));
看起来不可能将arrayUnion 和arrayRemove 与set 一起使用,尽管文档中说:“返回一个可以与set() 或update() 一起使用的特殊值”
【问题讨论】:
-
请编辑问题以准确说明
myModel是什么。我们应该有足够的信息来自行重现该问题。 -
@DougStevenson:已更新。为了发布的目的,代码被过度简化了,但它也随之重现。
-
为了完整起见,您是否尝试过 arrayUnion 的其他参数?只是字符串或数字呢?您是否能够辨别出哪些有效哪些无效的模式?
-
哪些元素不起作用?
-
@AlexMamo:确切的元素是 POJO,就像
MyModel但有更多字段;普通的Strings 和ints。没什么特别的。
标签: java android firebase google-cloud-firestore