Невозможно обновить полный дочерний объект в Firebase Java - PullRequest
1 голос
/ 08 октября 2019

У меня есть два класса :

@Data
public static class Person {
    private String id;
    private String value;
    private Address address;

}

@Data
public static class Address {
    private String add1;
    private String add2;
}

@Test
void name2() throws ExecutionException, InterruptedException {

    final Person p = new Person();
    p.setId("2FEpIFGqH7izWJ1ydfaKtg");
    p.setValue("some-value");

    final Address address = new Address();
    address.setAdd1("Add 1");
    address.setAdd2("Add 2");
    p.setAddress(address);

    final Map<String, Object> params = new HashMap<>();
    params.put("address", address);

    firestore.collection("test").document("2FEpIFGqH7izWJ1ydfaKtg").update(params).get();

    // firestore.collection("test").document("2FEpIFGqH7izWJ1ydfaKtg").set(params, SetOptions.merge()).get(); This also doesn't works, I get same error.
}

Я получаю следующее ошибка при запуске этого кода:


com.google.cloud.firestore.FirestoreException: Cannot convert CustomerRepositoryTest.Address(add1=Add 1, add2=Add 2) to Firestore Value
at com.google.cloud.firestore.FirestoreException.invalidState(FirestoreException.java:51)
    at com.google.cloud.firestore.UserDataConverter.encodeValue(UserDataConverter.java:178)
    at com.google.cloud.firestore.DocumentSnapshot.fromObject(DocumentSnapshot.java:89)
    at com.google.cloud.firestore.UpdateBuilder.performUpdate(UpdateBuilder.java:513)
    at com.google.cloud.firestore.UpdateBuilder.update(UpdateBuilder.java:347)
    at com.google.cloud.firestore.DocumentReference.update(DocumentReference.java:231)

ОднакоЯ могу обновить частичное значение настройки данных для add1 , обратившись к документу по пути: /test/<ID>/address.add1

Я хочу, чтобы механизм обновил весь объект а не просто конкретное значение. Может кто-нибудь помочь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Наконец, выяснили решение:

@Test
void name2() throws ExecutionException, InterruptedException {

    final Person p = new Person();

    final Address address = new Address();
    address.setAdd1("Add 1");
    address.setAdd2("Add 2");
    p.setAddress(address);

    final Map<String, Object> params = new HashMap<>();
    params.put("address", address);

    firestore.collection("test").document("2FEpIFGqH7izWJ1ydfaKtg").set(test, SetOptions.mergeFields("address")).get();

}

Используя SetOptions.mergeFields () и предоставляя поля для обновления, я смог обновить указанные поля.

0 голосов
/ 08 октября 2019

Чтобы написать весь объект, используйте ref.set(p). Это перезапишет любые существующие данные в ref данными в p.

Нет способа записать подмножество данных объекта в местоположение. Если вам нужна эта функциональность, вам нужно создать Map с конкретными полями, которые вы хотите обновить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...