Eu estou tentando executar FieldValue.arrayUnion()
no set()
, mas é lançar uma exceção. Estou usando em set
vez de update
, porque quero que ele crie o documento, se não existir.
Código (no meu caso Batch Write
, é , mas acho que o princípio é o mesmo)
WriteBatch batch = db.batch();
MyModel myModel = new MyModel("rwTEPzn9vjyhZCZxFeq8", "Mangesh"); // sample data
batch.set(docRef, FieldValue.arrayUnion(myModel), SetOptions.mergeFields("items")); // throws exception
Rastreio de pilha:
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)
ATUALIZAÇÃO 1: MyModel é uma classe POJO muito simples com duas seqüências de caracteres.
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;
}
}
ATUALIZAÇÃO 2: A exceção é lançada String
e int
valores também. Ou seja, FieldValue.arrayUnion("abc")
nem FieldValue.arrayUnion(1)
funciona. Eu também observei o mesmo comportamento no caso de arrayRemove()
.
ATUALIZAÇÃO 3: Aqui está uma captura de tela do meu banco de dados.
ATUALIZAÇÃO 4: testei set
fora batch
, diretamente no documento. Falha. Observe que items
foi esvaziado antes de fazer isso para evitar conflitos relacionados ao tipo.
docRef.set(FieldValue.arrayUnion("abc"), SetOptions.mergeFields("items"));
Parece impossível de usar arrayUnion
e arrayRemove
com set
, apesar da documentação que diz: "retorna um valor especial que pode ser usado com set()
ou update()
"
Finalmente, encontrei uma solução. Aqui está o código:
Map<String, Object> map = new HashMap<>();
map.put("items", FieldValue.arrayUnion(myModel));
batch.set(docRef, map, SetOptions.merge());
Isso cria o documento, se não existe, e atualiza a items
matriz. Observe que, SetOptions.merge()
é usado em vez de SetOptions.mergeFields()
.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras