【问题标题】:fill array with different objects from database用数据库中的不同对象填充数组
【发布时间】:2020-09-06 11:06:49
【问题描述】:

我有一个数组并尝试用我的数据库中的对象填充这个数组。到目前为止,这种方式是有效的

var array: ArrayList<MyObject>()

val itemsToFillArray: List<MyObject> = documentSnapshots.toObjects(MyObject::class.java)
array.addAll(itemsToFillArray)

但我现在的问题是,我的数据库中有多个对象,而不仅仅是MyObject。我已经给我的对象一个接口并以这种方式尝试过,但它不起作用。 如何从我的数据库中检索不同的对象并将它们存储在我的数组中?

【问题讨论】:

  • 有一个类似的线程解决了这个问题,它也与 firestore 和 kotlin 一起使用 ArrayList stackoverflow.com/questions/54647028/…
  • documentSnapshots的类型是什么?你如何检索数据?有没有考虑过使用 JPA,它会为您转换对象?这个问题的未知变量太多

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


【解决方案1】:

我已经给我的对象一个接口。

假设您使用接口MyInterface

interface MyInterface { /* ... */ }

在这种情况下MyObject类和其他你想使用的类应该实现这个接口:

class MyObject : MyInterface { /* ... */ }

class MyOtherObject : MyInterface { /* ... */ }

如果你操作正确,那么你应该能够在数组中存储不同的对象:

val array: ArrayList<MyInterface> = arrayListOf()

val itemsToFillArray1: List<MyObject> = documentSnapshots1.toObjects(MyObject::class.java)
val itemsToFillArray2: List<MyOtherObject> = documentSnapshots2.toObjects(MyOtherObject::class.java)
array.addAll(itemsToFillArray1)
array.addAll(itemsToFillArray2)

【讨论】:

    【解决方案2】:

    您可以声明为Any,而不是声明特定对象MyObject

    var array: ArrayList<Any>() = null
    

    但在添加项目时,您需要添加检查允许的对象,这样任何未知对象都不会被分配给数组。

    if(documentSnapshots.documents is MyObject || 
          documentSnapshots.documents is MyObjectTwo){
         array.add(documentSnapshots.documents)
    }
    

    【讨论】:

    • 好的,谢谢,但是我如何将数据库中的对象填充到我的数组中?喜欢这个val items: List&lt;Any&gt; = documentSnapshots.documents
    • 这不是一个答案,未经检查的铸造是不安全的。并且填充未知值并不是最好的主意。
    • 那么@AnimeshSahu 你有什么推荐的?
    • @DurgaM 在 kotlin 中没有 instanceof,有 is 关键字。而且我不明白您要在答案中显示什么,您正在覆盖变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2014-07-16
    • 2018-09-10
    • 2014-02-08
    • 2021-01-13
    • 2014-02-07
    相关资源
    最近更新 更多