Android Cloud Firestore将新项目添加到文档子列表

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

我需要将一个Item添加到我的Document中的列表中。不幸的是我的代码总是覆盖旧值。如何更改代码以始终添加新项目?

  db = FirebaseFirestore.getInstance();
    String userid = FirebaseAuth.getInstance().getCurrentUser().getUid();

    db.collection("Users").document(userid);

    Map<String, Object> docData = new HashMap<>();

    Map<String, Object> nestedData = new HashMap<>();
    nestedData.put("Ernährung2", true);


    docData.put("channelAbos", nestedData);
    db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
    .set(docData);
提问于
用户回答回答于

关于SetOptions merge()方法:

将set()调用的行为更改为仅替换其data参数中指定的值。set()调用中省略的字段将保持不变。

因此,SetOptions.merge()方法只会替换fieldPaths下的字段。任何未在fieldPaths中指定的字段都将被忽略并保持不变。

作为一个结论,如果文档不存在,它将被创建。如果文档确实存在,则其内容will be overwritten包含新提供的数据,除非您指定数据应合并到现有文档中。因此,要解决此问题,请更改以下代码行:

db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData);

db.collection("Users").document(FirebaseAuth.getInstance().getCurrentUser().getUid())
.set(docData, SetOptions.merge());
用户回答回答于

使用一个参数调用的set()每次都会覆盖整个文档。

如果该文档不存在,则将创建该文档。如果文档确实存在,其内容将被新提供的数据覆盖

如果要向现有列表添加值,则应使用FieldValue.arrayUnion():

如果您的文档包含数组字段,则可以使用arrayUnion()和arrayRemove()来添加和删除元素。arrayUnion()将元素添加到数组中,但只添加元素。

我将指出,你现在正在使用Map创建的对象将创建一个对象,而不是列表。请确保您有一个列表/数组类型字段,而不是要使用的对象。

扫码关注云+社区

领取腾讯云代金券