DocumentSnapshot(Firestore)到包含自定义对象列表的Kotlin对象

时间:2018-07-27 14:54:43

标签: android firebase kotlin google-cloud-firestore

我有一个对象User

@IgnoreExtraProperties
object User {
val firstName: String = ""
val lastName: String = ""
val employeeId: String = ""
val city: String = ""
val email: String = ""
var salaries = mutableListOf<Salary>()
}

薪水如下:

@IgnoreExtraProperties
object Salary {
var employeeId: String? = ""
var value: Int? = 0
var startDate:Date = Date()
}

从Firestore检索用户数据时,我正在使用以下代码从Firestore解析DocumentSnapshot

documentSnapshot.toObject(User::class.java)

除了“薪水清单”之外,其他所有东西都应该像它应该的那样工作。列表的大小是正确的(在我的情况下是3),但它是3次相同元素,而不是3个不同元素-关于如何解决该问题的任何想法...? :S

精确代码:

 fun getUser(): Observable<Boolean> {
    return Observable.create<Boolean> {
        FirebaseFirestore.getInstance().collection("users").document(FirebaseAuth.getInstance().currentUser!!.uid).addSnapshotListener(object : EventListener<DocumentSnapshot> {
            override fun onEvent(p0: DocumentSnapshot?, p1: FirebaseFirestoreException?) {
                if (p0!!.exists()) {
                     p0.toObject(User::class.java)
                    it.onNext(true)
                } else {
                }
            }
        }
        )
    }
}

数据库结构:

pic1 pic2

2 个答案:

答案 0 :(得分:1)

正如我在您的数据库中看到的那样,salaries属性不是列表,而是一个array,其中包含三个其他对象。当您使用mutableListOf<Salary>()将数据添加到Cloud Firestore数据库时,这并不意味着数据将存储为列表,而是意味着您将数据存储为数组,其中的键是数字和这些值是实际的Salary对象。请注意,List在Cloud Firestore中不是supported data type

因此,要解决此问题,只需获取所需的用户文档,然后从salaries属性中以List的形式获得薪水。但是请注意,即使salaries对象作为数组存储在数据库中,返回的对象也是ArrayList,而不是array。现在,只需遍历列表,并获得所有三个Salary类型的对象。就是这样!

PS。还请确保数据库中所有这三个薪水对象都作为不同的对象。我在您的图片中看到,前两个是相同的。

Firestore-root
   |
   --- salaries (collection)
         |
         --- userId (document)
               |
               --- userSalaries (collection)
                       |
                       --- salaryId (document)
                             |
                             --- //salary properties

答案 1 :(得分:0)

哇,所以正确的答案是Salary被视作“对象”而不是“类”(这就是为什么我在“薪水”列表中多次具有相同的元素) 所以“对象”->“类”