Cloud Firestore - QuerySnapshot.toObjects引发空指针异常

时间:2018-01-13 15:04:44

标签: firebase kotlin google-cloud-firestore

我偶然发现了一个奇怪的问题。我正在尝试完成一件简单的事情 - 将所有内容从QuerySnapshot转换为某种类型的集合。

fun createReminder(reminder: Reminder) = 
    remindersCollectionRef.document("${reminder.taskId}").set(reminder)

fun tryRemoveReminder(taskId: Int) = 
    remindersCollectionRef.document("$taskId").delete()

fun getReminders(onComplete: (List<Reminder>) -> Unit) {
    remindersCollectionRef.get()
        .addOnSuccessListener { querySnapshot ->
            if (!querySnapshot.isEmpty)
                 onComplete(querySnapshot.toObjects(Reminder::class.java))
            }
        }

问题出在getReminders函数中。我知道收藏中有一个提醒。它也是100%的Reminder类型,你可以看到我已经检查querySnapshot是否为空。但是,当我调用toObjects时,我得到一个空指针异常。

堆栈追踪:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.lang.reflect.Constructor.newInstance(java.lang.Object[])' on a null object reference
at com.google.android.gms.internal.zzevb$zza.zza(Unknown Source:57)
at com.google.android.gms.internal.zzevb.zza(Unknown Source:1025)
at com.google.android.gms.internal.zzevb.zza(Unknown Source:2)
at com.google.firebase.firestore.DocumentSnapshot.toObject(Unknown Source:10)
at com.google.firebase.firestore.QuerySnapshot.toObjects(Unknown Source:27)
at com.mypackage.util.FirestoreUtil$Companion$getReminders$1.onSuccess(FirestoreUtil.kt:131)
at com.mypackage.util.FirestoreUtil$Companion$getReminders$1.onSuccess(FirestoreUtil.kt:18)
at com.google.android.gms.tasks.zzj.run(Unknown Source:27)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)                                                                                      at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

提醒课程:

data class Reminder(val taskDocRef: DocumentReference, val taskId: Int)

这个问题对我来说似乎很奇怪。我将非常感谢你的帮助:)

2 个答案:

答案 0 :(得分:2)

如果您仔细阅读有关映射自定义对象here的Cloud Firestore查询要求的文档,则会注意到:

  

重要提示:每个自定义类都必须具有公共构造函数   没有争论。此外,该课程必须包含一个公共的getter   每个属性。

答案 1 :(得分:1)

确保您在Firestore中更改了规则

有关规则,请转到https://firebase.google.com/docs/firestore/quickstart#secure_your_data,然后复制testmode规则并将其粘贴到Firestore规则中

更改规则需要10分钟。请在10分钟后再次运行该应用程序