Firestore含DocumentReference的数据模型Parcel序列化问题
解决Firestore DocumentReference的Parcelable实现问题
嗨,刚好我之前也处理过类似的场景,给你一步步讲清楚怎么解决:
首先,针对Firestore里的reference类型字段,Java类里直接用DocumentReference类型就可以,官方SDK会自动帮你完成document.toObject(YourClass.class)的映射,只要变量名和数据库字段名匹配就行,这点不用担心。
接下来是Parcelable的实现难点:因为DocumentReference没有实现Serializable接口,所以不能用writeSerializable()和readSerializable()。不过我们可以利用它的唯一路径字符串来完成读写——每个DocumentReference都对应一个唯一的文档路径,我们可以把路径写入Parcel,读取时再通过路径重建DocumentReference。
下面是完整的代码示例:
import android.os.Parcel; import android.os.Parcelable; import com.google.firebase.firestore.DocumentReference; import com.google.firebase.firestore.FirebaseFirestore; public class MyDataModel implements Parcelable { private String mString; private DocumentReference mDocRef; // 对应Firestore的reference字段 // 常规构造方法 public MyDataModel(String mString, DocumentReference mDocRef) { this.mString = mString; this.mDocRef = mDocRef; } // Parcel构造方法,读取数据 protected MyDataModel(Parcel in) { mString = in.readString(); // 读取路径字符串,重建DocumentReference String docPath = in.readString(); if (docPath != null) { mDocRef = FirebaseFirestore.getInstance().document(docPath); } } // 写入Parcel的方法 @Override public void writeToParcel(Parcel parcel, int flags) { parcel.writeString(mString); // 写入DocumentReference的路径字符串 parcel.writeString(mDocRef != null ? mDocRef.getPath() : null); } // 固定实现,返回0即可 @Override public int describeContents() { return 0; } // Parcelable的CREATOR,必须实现 public static final Creator<MyDataModel> CREATOR = new Creator<MyDataModel>() { @Override public MyDataModel createFromParcel(Parcel in) { return new MyDataModel(in); } @Override public MyDataModel[] newArray(int size) { return new MyDataModel[size]; } }; // 可选:添加getter/setter方法 public String getmString() { return mString; } public DocumentReference getmDocRef() { return mDocRef; } }
几个注意点:
- 确保在使用
FirebaseFirestore.getInstance()之前,Firebase已经完成初始化(一般在Application类里初始化就没问题); - 处理null情况:如果你的
DocumentReference字段可能为null,一定要在读写时判断,避免空指针异常; - 这种方式完全依赖文档路径的唯一性,而Firestore的文档路径本身就是唯一标识,所以不用担心重建的
DocumentReference和原对象不一致。
内容的提问来源于stack exchange,提问作者Paradox
相关产品推荐
相关产品推荐

