【问题标题】:DocumentSnapshot (Firestore) to Kotlin Object that contains a list of custom ObjectDocumentSnapshot (Firestore) 到包含自定义对象列表的 Kotlin 对象
【发布时间】:2019-01-04 17:36:06
【问题描述】:

我有一个对象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 {
                }
            }
        }
        )
    }
}

数据库结构:

【问题讨论】:

  • 能否请您添加您用于获取数据的整个代码?还请在托管这 3 个元素的位置添加您的数据库结构。
  • @AlexMamo 当然 - 等一下
  • 是的,为了看得更清楚。
  • @AlexMamo 我将其添加到问题中

标签: android firebase kotlin google-cloud-firestore


【解决方案1】:

正如我在您的数据库中看到的,salaries 属性不是一个列表,而是一个包含三个其他对象的array。当您使用 mutableListOf&lt;Salary&gt;() 向 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

【讨论】:

  • @AlexMemo 非常喜欢,会立即尝试 - 但是当你说“是一个对象(更准确地说是一张地图)”时不理解部分,因为当我将鼠标悬停在“薪水”上时 -控制台中的节点显示它是一个“数组”:S - 我在这里误解了一些东西..?
  • 对不起,我没有看到数字和Salary 对象之间没有冒号(:),所以你是正确的是一个数组。请查看我更新的 andwer。
  • 你很乐意解释,你的时间让我头疼:),祝你今天愉快!
  • 该死的,不能让它工作 - 我所做的是: var Salary = p0.get("salaries") as List 但这给出了错误:'HashMap cannot be cast to Salary ' 这意味着它检索 Hashmaps 列表而不是 Salaries,因此我将其转换为 Salary 对象,我必须通过 Map 进行迭代/创建新的 Salary 对象以进行迭代/并“手动”分配所有值 - 感觉就像一个喧嚣,所以请告诉我,我这样做是不正确的:S
  • 您需要获取Salary 对象的列表。尝试迭代该地图。它包含什么,Salary 对象?
【解决方案2】:

正确的答案是 Salary 被声明为 object 而不是 class(这就是为什么我的 salaries 列表中有多次相同的元素) 所以object -&gt; class

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多