Firestore DocumentReference序列化

时间:2019-01-21 10:52:21

标签: android firebase kotlin google-cloud-firestore

我有一个pojo,可以映射一个Firestore文档。该文档包含对其他集合的其他文档的引用。

class Game(var local: String? = null, var visitor: String? = null,
        var events: MutableList<DocumentReference> = mutableListOf(), var date: Date? = null): Serializable 

问题在于DocumentReference无法序列化。我已经读到可以将路径另存为String,然后自己创建对象(FirebaseFirestore.getInstance()。document(path)),但是在Firestore中,该字段不再是Reference类型的字段。

所以我的问题是,这是好方法吗?另外,该字段是字符串而不是引用是否重要?

问候,迭戈

2 个答案:

答案 0 :(得分:1)

  

所以我的问题是,这是个好方法吗?

是的。 DocumenetReference中最重要的部分是字符串路径。如果将其序列化,则可以很容易地重新构造DocumentReference对象。

结论是,如果需要序列化DocumentReference对象,请使用DocumentReference的getPath()方法来获取表示文档在数据库中位置的文字字符串。要将路径字符串反序列化为DocumentReference对象,只需使用FirebaseFirestore.getInstance().document(path)

编辑:

  

这意味着数据库中的字段现在是String而不是Reference。

是的。

  

有关系吗?我想作为参考必须具有某种优势。

是的,因为现在该属性的类型为String,所以您无法再利用DocumentReference类提供的功能。但这是可以帮助您实现所需目标的解决方法。字符串类可序列化,而DocumentReference则不能。

答案 1 :(得分:0)

我有一个详尽的答案here。代码是

private ArrayList<String> docRefToString(ArrayList<DocumentReference> products) {
    ArrayList<String> newProducts = new ArrayList<String>();
    for (DocumentReference product : products) {
        newProducts.add(product.getPath());
    }
    return newProducts;
}

private ArrayList<DocumentReference> docStringToDoc(ArrayList<String> products) {
    ArrayList<DocumentReference> newProducts = new ArrayList<DocumentReference>();
    for (String product : products) {
        newProducts.add(FirebaseFirestore.getInstance().document(product));
    }
    return newProducts;
}

在Parcel实现中..

private Request(Parcel in) {
    ...
    ArrayList<String> strProducts = in.createStringArrayList();
    this.products = docStringToDoc(strProducts);
    ...
}

@Override
public void writeToParcel(Parcel dest, int flags) {
    ...
    dest.writeStringList(docRefToString(this.products));
    ...
}