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

时间:2019-01-03 19:40:20

标签: android google-cloud-firestore

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

  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);

2 个答案:

答案 0 :(得分:0)

According to the documentation,用一个参数调用的set()每次都会覆盖整个文档。

  

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

如果要将值添加到现有列表,则应使用same page of documentation中所述的FieldValue.arrayUnion():

  

如果您的文档包含一个数组字段,则可以使用arrayUnion()和   arrayRemove()添加和删除元素。 arrayUnion()添加元素   到一个数组,但只有不存在的元素。

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

答案 1 :(得分:0)

关于official documentation所说的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());