如何阻止Firestore保存所有数据?

时间:2018-07-18 18:20:40

标签: java android firebase google-cloud-firestore

我正在将Cloud Firestore与Android Studio结合使用。我注意到,似乎将类中的每个字段都保存到数据库中,而不仅仅是保存到具有setter / getter的字段中。如何阻止这种情况发生?

例如,假设我有一个名为Box的类,其定义如下:

private class Box {
     private int id;
     private String name, label;

     public Box(){}

     public void setId(int thisId) {id = thisId;}
     public void setName(String thisName) { name = thisName;}

     public int getId() { return id;}
     public String getName { return name;}

     public setup label () { ... }
}

我只有id和name的setter和getter,因为它们是我要保存到数据库的。我不想保存标签,因为它每次都会更改。但是,无论如何都将其保存,其值为 null

我在做什么错?如何阻止它保存标签值?

3 个答案:

答案 0 :(得分:1)

您可以使用map设置所需的变量。然后将该地图发送到Firestore。

Map<String, Object> map = new HashMap<String, Object>();
map.put("id", "value");
map.put("name", "value");

firestore.collection("Your_collection_name).document(uid).add(map)...`

然后您可以添加成功侦听器或完整侦听器。

答案 1 :(得分:1)

无法使用默认对象序列化,也不能有选择地删除不符合您的条件的属性。对象序列化始终使用所有可用的对象属性,而不管其值如何。与Firebase Realtime数据库中根本不会显示不存在的值不同,在Cloud Firestore中,如果您创建一个对象时未设置其值,则Firestore将分配null的值。

如果您根本不希望数据库中存在任何值,则可以使用@Grimthorr的answer,如@tyczj在其注释中建议的那样。

为避免在数据库中具有null属性,正如@Raj所建议的那样,您应该使用Map,该属性仅包含要存储的文档的属性。更重要的是,如果您不想为字段存储null,还应该检查null的每个值。这是您唯一可以实现的目标。

official documentation中,这就是代码中的样子:

Map<String, Object> city = new HashMap<>();
city.put("name", "Los Angeles");
city.put("state", "CA");
city.put("country", "USA");
db.collection("cities").document("LA").set(city);

如果您的应用已经启动,并且您的数据库中有null个值,则可以创建地图并使用FieldValue.delete(),如下所示:

Map<String, Object> map = new HashMap<>();
map.put("yourField", FieldValue.delete());
yourRef.update(map);

具有null值的字段将不再显示。

答案 2 :(得分:0)

不是为我工作。因此,我在要排除写入Firestore db的字段的getter方法之前放置了@Exclude批注,并且可以正常工作:

@Exclude
public String getId() {
    return id;
}

如果是私有修饰符,则从变量声明中删除@Exclude