有没有办法管理POJO类属性存储在Firestore中?

时间:2018-02-15 17:48:05

标签: java firebase google-cloud-firestore

在我的Android应用程序中,我有一个POI类,其中包含以下属性和构造函数:

/**
 * A POJO class for a POI (Point Of Interest)
 */
@Parcel
public class POI {
    String id;
    String name;
    int release;
    Double latitude;
    Double longitude;
    String description;
    String img_url;
    String collection;
    int collectionPosition;
    String stampText;
    boolean stampChecked; // Has the POI been checked to be stamped?
    Stamp stamp;

public POI(){}

public POI(String id){
    this.id = id;}

public POI(String id,
           String name,
           int release,
           Double latitude,
           Double longitude,
           String description,
           String img_url,
           String collection,
           int collectionPosition,
           String stampText) {
    this.id = id;
    this.name = name;
    this.release = release;
    this.latitude = latitude;
    this.longitude = longitude;
    this.description = description;
    this.img_url = img_url;
    this.collection = collection;
    this.collectionPosition = collectionPosition;
    this.stampText = stampText;
    this.stampChecked = false;
}

当我在Firestore中存储POI对象时,我发现了两个问题。

  1. Firestore创建了一个标记属性,显然是因为我的POI类中有一个标记属性。我的POI模型有一个Stamp属性,因为我只需要它来代码。我不需要它存储在数据库中。有没有办法,比如我可以用来告诉Firestore它可以忽略哪些字段的注释?

  2. 即使我的POI类中没有任何此类属性,Firestore也会创建一个名为“stamped”的属性。我猜这种情况的唯一原因是因为我班上有以下方法:

    public boolean isStamped(){
         return (stamp instanceof Stamp);
    }
    
  3. 有没有办法让Firebase忽略某些属性或强制Firebase使用特定的构造函数,而无需删除或重命名我的getter和setter

2 个答案:

答案 0 :(得分:2)

您可以在字段或方法上使用Exclude注释,以防止序列化。

在下面的课程中," bar"序列化时不会显示属性,因为getter使用@Exclude进行注释。

   z         x         y
1: b 1.0531555  2.121852
2: a 0.3631284 -1.388861
3: c 4.0566838 -2.367558

答案 1 :(得分:0)

是的。与Firebase实时数据库(根本不显示不存在的值)不同,如果添加null字段,则在Cloud Firestore中,结果将为yourField: null。如果您想确保在涉及对象时没有null值,或者在字符串时出现空字符串"",那么在将文档写入Firestore时,您可以使用Map并仅使用您想要的字段填充它。

HashMap<String, Object> map = new HashMap<>();
if (stampChecked != null) {
    map.put("stampChecked", true);
}
//Same for the other properties.

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
rootRef.collection("yourCollection").document("yourDocument").set(map);

如果您的数据库中已有此类值,则可以使用以下代码行将其删除:

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