我正在将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 。
我在做什么错?如何阻止它保存标签值?
答案 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