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

标签 android firebase kotlin google-cloud-firestore

我有一个对象用户:

@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)

除了“工资 list ”之外,一切正常。列表的大小是正确的(在我的例子中是 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

最佳答案

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

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

附言。还要确保将所有这三个工资对象作为不同的对象保存在数据库中。正如我在您的图片中看到的,前两个是相同的。

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

关于android - DocumentSnapshot (Firestore) 到包含自定义对象列表的 Kotlin 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51560580/

相关文章:

javascript - 使用 angularfire2 分片到多个数据库

java - 将模型类加载到 Kotlin 类

kotlin - foreach Kotlin 等待间隔跟随流程

android - 如何从编辑文本中删除键盘,但在单击编辑文本时显示键盘?

android - 没有帐户的 SyncAdapter

android - 由于计算能力不同,使用 TensorFlow-Lite 时模型的运行时间在不同的 Android 设备上可能会有很大差异

node.js - Firebase 管理 SDK Node - 引用中的通配符用法

android - 查看 Firebase 上的 childEventListener 是否已完成所有数据的加载

android - 如何从 Android 手机屏幕捕获视频流并将其显示在笔记本电脑上?

kotlin - Kotlin 中 ArrayList<String>() 和 mutableListOf<String>() 之间的区别