代码之家  ›  专栏  ›  技术社区  ›  pb4now

文档快照(firestore)到包含自定义对象列表的Kotlin对象

  •  1
  • pb4now  · 技术社区  · 7 年前

    我有一个对象

    @ignoreextraproperties
    对象用户{
    val firstname:string=“”
    val lastname:string=“”
    val employeeid:string=“”
    val-city:string=“”
    val电子邮件:string=“”
    var salays=可变薪酬列表
    }
    

    工资如下:

    @ignoreextraproperties
    目标工资{
    var employeeid:string?=“”
    var值:int?= 0
    var开始日期:日期=日期()。
    }
    

    从FireStore检索用户数据时,我使用此代码来分析FireStore中的documentSnapshot

    >代码>文档快照.toObjor(用户::类.java)

    
    

    除了“工资单”以外,一切都应该如此。列表的大小是正确的(在我的例子中是3),但它是同一个元素的三次,而不是3个不同的元素-关于如何修复它的任何想法…?S/P>

    准确代码:

    fun getuser():observable<boolean>。{
    返回Observable.Create<Boolean>。{
    firebasefirestore.getInstance().collection(“用户”).document(firebaseauth.getInstance().currentUser!!.uid).addSnapshotListener(对象:EventListener<DocumentSnapshot>。{
    覆盖fun onEvent(p0:documentSnapshot?,p1:FireBaseFireStoreException?){
    如果(p0!!.exists())存在{
    P0(用户::类Java)
    it.onnext(真)
    }其他{
    }
    }
    }
    )
    }
    }
    

    数据库结构:

    .

    工资如下:

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

    从FireStore检索用户数据时,我使用此代码来分析DocumentSnapshot从消防站:

    documentSnapshot.toObject(User::class.java)
    

    除了“工资单”以外,一切都应该如此。列表的大小是正确的(在我的例子中是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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Alex Mamo    7 年前

    正如我在你的数据库中看到的, salaries 属性不是列表,是 array 包含其他三个对象。将数据添加到云FireStore数据库时,请使用 mutableListOf<Salary>() 这并不意味着数据将被存储为列表,而是意味着将数据存储为数组,其中键是数字,值是实际值。 Salary 物体。请注意, List 不是 supported data type 在云火商店。

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

    另外,确保数据库中的这三个薪资对象都是不同的对象。正如我在你的照片中看到的,前两个是一样的。

    Firestore-root
       |
       --- salaries (collection)
             |
             --- userId (document)
                   |
                   --- userSalaries (collection)
                           |
                           --- salaryId (document)
                                 |
                                 --- //salary properties
    
        2
  •  0
  •   pb4now    7 年前

    哇,所以正确的答案是,工资被宣布为“对象”,而不是“班级”(这就是为什么我在“工资”列表中多次使用相同的元素) 所以“对象”->“类”