使用 removeValue() 时 Firebase 应用程序崩溃

Posted

技术标签:

【中文标题】使用 removeValue() 时 Firebase 应用程序崩溃【英文标题】:Firebase app is crashing when using removeValue() 【发布时间】:2017-08-01 12:44:42 【问题描述】:

当我使用以下代码...并按下应用程序中的删除按钮时,该值在 firebase 数据库中被删除,但会导致我的应用程序崩溃。

    mSingleRemoveBtn.setOnClickListener(new View.OnClickListener()
        
            @Override
            public void onClick(View view)
            
                if(mPostKey!=null)
                
                    System.out.println("The key is " + mPostKey);

                    mDatabase.child(mPostKey).removeValue();
                    Intent mainIntent = new Intent(BlogSingleActivity.this, MainActivity.class);
startActivity(mainIntent);

                
                else
                
                    System.out.println("The key is empty");
                

            

此外,当我删除 "mDatabase.child(mPostKey).removeValue();" 时,应用程序运行正常,但显然没有从我的数据库中删除条目。

LOGCAT

    08-01 19:42:51.093 32536-32536/com.vks_apps.blogs I/System.out: The key is -KqT82kPqOE_iq0UKHnm

                                                                --------- beginning of system
08-01 19:42:51.129 32536-4494/com.vks_apps.blogs V/FA: Inactivity, disconnecting from the service
08-01 19:42:51.131 32536-32536/com.vks_apps.blogs D/androidRuntime: Shutting down VM
08-01 19:42:51.132 32536-32536/com.vks_apps.blogs E/UncaughtException: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
                                                                           at com.google.firebase.database.DatabaseReference.child(Unknown Source)
                                                                           at com.vks_apps.blogs.BlogSingleActivity$1.onDataChange(BlogSingleActivity.java:88)
                                                                           at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                           at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                           at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                           at android.os.Handler.handleCallback(Handler.java:751)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                           at android.os.Looper.loop(Looper.java:154)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
08-01 19:42:51.135 32536-4494/com.vks_apps.blogs D/FA: Logging event (FE): _ae, Bundle[_o=crash, _sc=BlogSingleActivity, _si=-4635728123048285128, timestamp=1501596771132, fatal=1]
08-01 19:42:51.157 32536-4494/com.vks_apps.blogs V/FA: Using measurement service
08-01 19:42:51.157 32536-4494/com.vks_apps.blogs V/FA: Connecting to remote service

                                                       --------- beginning of crash
08-01 19:42:51.378 32536-32536/com.vks_apps.blogs E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    Process: com.vks_apps.blogs, PID: 32536
                                                                    java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
                                                                        at com.google.firebase.database.DatabaseReference.child(Unknown Source)
                                                                        at com.vks_apps.blogs.BlogSingleActivity$1.onDataChange(BlogSingleActivity.java:88)
                                                                        at com.google.android.gms.internal.zzbmz.zza(Unknown Source)
                                                                        at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
                                                                        at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
                                                                        at android.os.Handler.handleCallback(Handler.java:751)
                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                        at android.os.Looper.loop(Looper.java:154)
                                                                        at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
08-01 19:42:51.445 32536-5218/com.vks_apps.blogs I/FirebaseCrash: Sending crashes
08-01 19:42:52.021 32536-5218/com.vks_apps.blogs I/FirebaseCrash: Response code: 200
08-01 19:42:52.023 32536-5218/com.vks_apps.blogs I/FirebaseCrash: Report sent with crash report id: 6e22679504000000

【问题讨论】:

鉴于堆栈跟踪中的问题根源,您能指出代码中的BlogSingleActivity.java:88吗? Vipul,请不要向 cmets 发送包含其他问题链接的垃圾邮件。你已经做了几个地方,这里和下面的答案。这对其他用户来说很烦人并且违反了我们的规则。如果有人想找到您的其他问题,他们可以在您的个人资料中看到所有这些问题。 【参考方案1】:

当你 logcat sais,Can't pass null for argument 'pathString' in child(),这意味着这行代码中的东西是 null

mDatabase.child(mPostKey).removeValue();

唯一可以为空的是mPostKey。在使用removeValue() 方法之前检查nullity

if(mPostKey != null) 
    mDatabase.child(mPostKey).removeValue();

还要从 Firebase 数据库中删除记录,请确保 mPostKey 不为空。看看哪里变成了 null。

看到更新后的问题,其中mPostKey 显示在logcat -KqT82kPqOE_iq0UKHnm 中,BlogSingleActivity 第 88 行出现的错误就是问题所在。问题实际上是在第 88 行,mPostKey 再次使用导致应用程序崩溃,因为将空值传递给 child() 方法。添加mPostKey != null 仅用于检查无效性。

希望对你有帮助。

【讨论】:

【参考方案2】:

在调用栈中你可以看到问题出在BlogSingleActivity$1.onDataChange()。您正在调用数据库并将一个空值传递给child()

【讨论】:

这就是问题所在...该值不为空...仍然出现此错误。 鉴于错误消息,在BlogSingleActivity.java:88 上,您将一个空值传递给child()。不同意错误消息从来没有让我走得太远。但是没有看到minimal code that reproduces the problem(阅读链接,它非常有用),将很难进一步帮助您。

以上是关于使用 removeValue() 时 Firebase 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Stripe 和 Firebase:FirebaseError:collection() 的第一个参数应为 CollectionReference、DocumentReference 或 Fireba

Firebase onDisconnect()不起作用

Uncaught FirebaseError: Firebase: No Firebase App '[DEFAULT]' has been created - 在 vue.js 中调用 Fireba

从firebase中删除项目的正确方法

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

如何检测firebase观察childAdded在达到queryLimit时停止调用?