【问题标题】:Cloud Firestore - QuerySnapshot.toObjects Throws Null Pointer ExceptionCloud Firestore - QuerySnapshot.toObjects 引发空指针异常
【发布时间】:2018-06-22 19:02:20
【问题描述】:

我偶然发现了一个奇怪的问题。我正在尝试完成一件简单的事情 - 将 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 函数中。我知道收藏中有一个提醒。它也是 Reminder 类型的 100%,如您所见,我已经检查 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)

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

【问题讨论】:

  • 你能发布你得到的堆栈跟踪吗?您可以测试空然后立即获得 NPE,这似乎很奇怪。也许toObjects 函数里面有什么东西?
  • @Todd 我刚刚添加了堆栈跟踪。
  • 抱歉,还有一件事。我们可以获取提醒的代码吗?
  • @Todd 当然。很抱歉没有尽快添加。
  • 尝试将其创建为具有默认(零参数)构造函数的类。

标签: firebase kotlin google-cloud-firestore


【解决方案1】:

如果您仔细阅读 Cloud Firestore query requirements for mapping Custom objects here的文档,会有提示:

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

【讨论】:

    【解决方案2】:

    确保更改 Firestore 中的规则

    对于规则去https://firebase.google.com/docs/firestore/quickstart#secure_your_data并复制testmode的规则并将它们粘贴到firestore规则中

    更改规则需要 10 分钟。所以 10 分钟后再次运行应用程序

    【讨论】:

      猜你喜欢
      • 2021-08-24
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      相关资源
      最近更新 更多