可以使用 toObject 和 object 作为参数从 firestore 检索数据吗?

问题描述 投票:0回答:1

我有一个项目,我在其中从 Firestore 读取数据。我有几个集合,所以我成功地使用了 toObject 。现在,只是为了好玩(和节省代码),我想创建一个全局函数,用于读取数据并将我想要获取的对象类型作为参数发送。

我知道我忘记了一些东西,但我无法弄清楚,也许这是不可能的。

这是我的尝试,但出现错误:未解析的引用类。我知道我忘记了一些东西,但我无法弄清楚,也许这是不可能的。

    fun todosRegistros(coleccion: String, orden: String, clase: Class<Any>):Any{
        // Cargamos los supermercados
        db.collection(coleccion).orderBy(orden).get().addOnSuccessListener { registros ->
            for (registroIt in registros) {
                val item = registroIt.toObject<clase>()
            }
        }
    }  
android firebase kotlin google-cloud-platform google-cloud-firestore
1个回答
2
投票

您不能将

clase
指定为泛型类型。相反,您应该调用 QueryDocumentSnapshot#toObject(java.lang.Class) 函数,该函数将 Class 类型的对象作为参数。因此,在您的代码中,您应该进行以下更改:

fun todosRegistros(coleccion: String, orden: String, clase: Class<Any>):Any{
    // Cargamos los supermercados
    db.collection(coleccion).orderBy(orden).get().addOnSuccessListener { registros ->
        for (registroIt in registros) {
            val item = registroIt.toObject(clase)
            //                              👆
        }
    }
}

编辑:

我想我明白了。您正在寻找的称为“泛型函数”。所以在代码中应该是: fun <T> todosRegistros(coleccion: String, orden: String, clase: Class<T>):T{ // Cargamos los supermercados questionsRef.orderBy(orden).get().addOnSuccessListener { registros -> for (registroIt in registros) { val item = registroIt.toObject(clase) // 👆 } } }

现在您可以使用以下方式调用该函数:

todosRegistros("Tipo","nombre", Class<Tipo>)

另外,不要忘记添加以下导入:

import java.lang.Class

	
© www.soinside.com 2019 - 2024. All rights reserved.