如何使用Kotlin反序列化包含DocumentReference的Firestore DocumentSnapshot

时间:2017-11-04 23:46:35

标签: android firebase kotlin deserialization google-cloud-firestore

我有以下Firestore结构:

Firestore : User collection

我设法使用Kotlin对其进行反序列化,但仅使用Any作为城市和活动的类型。到目前为止,这是我的数据类:

@IgnoreExtraProperties
data class User (
        var firstName: String,
        var lastName: String,
        var displayName: String,
        var birthday: Date,
        var memberSince: Date,
        var city: Any,
        var activities: ArrayList<Any>
) {
    constructor():this("", "", "", Date(), Date(), Any(), ArrayList(0))
}

以下是我检索数据和反序列化的方法:

DocumentReference userRef = mFirestoreDB.collection("user").document(mFirebaseUser.getUid());
userRef.addSnapshotListener(this, new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(DocumentSnapshot documentSnapshot, FirebaseFirestoreException e) {
        if (documentSnapshot.exists()) {
            final User user = documentSnapshot.toObject(User.class);
            Log.i(TAG, user.toString());
        } else if(e != null) {
            Log.e(TAG, "Error retrieving user data from Firestore", e);
        }
    }
});

我想知道,我是否可以强烈地将城市和活动打造为DocumentReference,应该如此?

1 个答案:

答案 0 :(得分:0)

我想我发现了如何做到这一点。所以你需要做的就是使用这个awsome声明:lateinit,正如文档所说:

  

通常,声明为非null类型的属性必须是   在构造函数中初始化。然而,通常情况并非如此   方便。例如,可以通过初始化属性   依赖注入,或单元测试的设置方法。在这   case,您不能在构造函数中提供非null初始值设定项,但是   您仍然希望在引用属性时避免空检查   在一个班级的体内。

我的数据类现在看起来像:

@IgnoreExtraProperties
data class User2 (
        var firstName: String,
        var lastName: String,
        var displayName: String,
        var birthday: Date,
        var memberSince: Date,
        var activities: ArrayList<DocumentReference>
) {
    lateinit var city: DocumentReference
    constructor():this("", "", "", Date(), Date(), ArrayList(0))
}

自我注意:我真的需要阅读更多关于Kotlin ......