我有一个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类型的字段。
所以我的问题是,这是好方法吗?另外,该字段是字符串而不是引用是否重要?
问候,迭戈
答案 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));
...
}