【问题标题】:How to push a custom branch of data to Firebase?如何将自定义数据分支推送到 Firebase?
【发布时间】:2016-10-15 04:12:51
【问题描述】:

我正在制作一个带有这样一个分支的数据库:

我使用代码推送到 Firebase:

mDatabaseReference.child(Constant.CHILD_CHATONETOONE + "/" + hostUid + "/" + clientUid).push().setValue(new Message("Hi guy"), new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        if(databaseError!= null)
              Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_LONG).show();
    }
});

但是当我使用此代码时,我的应用程序停止工作。似乎 Firebase 不接受我在数据库中建立新分支的方式。这是logcat:

10-15 11:46:16.720 3590-3590/com.team2_dtui.heyfriend_v2 E/AndroidRuntime: FATAL EXCEPTION: main

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.team2_dtui.heyfriend_v2/com.team2_dtui.heyfriend_v2.activity.MainActivity}: java.lang.NullPointerException
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
                                                                               at android.app.ActivityThread.access$600(ActivityThread.java:130)
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
                                                                               at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                               at android.os.Looper.loop(Looper.java:137)
                                                                               at android.app.ActivityThread.main(ActivityThread.java:4745)
                                                                               at java.lang.reflect.Method.invokeNative(Native Method)
                                                                               at java.lang.reflect.Method.invoke(Method.java:511)
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                                                                               at dalvik.system.NativeStart.main(Native Method)
                                                                            Caused by: java.lang.NullPointerException
                                                                               at com.team2_dtui.heyfriend_v2.activity.MainActivity.onCreate(MainActivity.java:43)
                                                                               at android.app.Activity.performCreate(Activity.java:5008)
                                                                               at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
                                                                               at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
                                                                               at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
                                                                               at android.app.ActivityThread.access$600(ActivityThread.java:130) 
                                                                               at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
                                                                               at android.os.Handler.dispatchMessage(Handler.java:99) 
                                                                               at android.os.Looper.loop(Looper.java:137) 
                                                                               at android.app.ActivityThread.main(ActivityThread.java:4745) 
                                                                               at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                               at java.lang.reflect.Method.invoke(Method.java:511) 
                                                                               at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                                                                               at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                                                                               at dalvik.system.NativeStart.main(Native Method) 

logcat 内部:com.team2_dtui.heyfriend_v2.activity.MainActivity.onCreate(MainActivity.java:43 是我上面给出的代码。

当我将此代码更改为一个孩子时,它工作正常:

mDatabaseReference.child(Constant.CHILD_CHATONETOONE).push().setValue(new Message("Hi guy"), new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
            if(databaseError!= null)
              Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_LONG).show();
        }
    });

我可以找出问题所在。如何在第一时间创建这个分支?帮我。我是 Firebase 新手。

【问题讨论】:

  • 应用停止是否有logcat?
  • 我已经更新了我的问题中的 logcat。 logcat 提示这段代码有问题。
  • 您可以使用 Firebase 控制台并将其导入为 json 文件,如果它只是一次。
  • @MohsenMirhoseiniArgi 因此,如果目前我没有要添加的数据,那么我必须导入示例数据吗?是这样吗,兄弟?
  • 可以在运行时创建分支。

标签: android firebase nullpointerexception firebase-realtime-database


【解决方案1】:

只有setValue 函数可以为您完成这项工作。一旦您转到引用的节点并将函数setValue 调用到该节点,它就会自动在那里创建一个分支。所以你需要删除push 函数调用。

另一件事是检查databaseError 字段是否为null。这是 adding a completion listener 上用于保存数据的 Firebase 文档。您需要检查databaseError 字段是否为null,就像文档中给出的示例一样。

所以你的代码可能看起来像这样。

mDatabaseReference.child(Constant.CHILD_CHATONETOONE + "/" + hostUid + "/" + clientUid).setValue(new Message("Hi guy"), new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
        if(databaseError != null)
            Toast.makeText(MainActivity.this, databaseError.getMessage(), Toast.LENGTH_LONG).show();
        else
            Toast.makeText(MainActivity.this, "Data saved successfully", Toast.LENGTH_LONG).show();

    }
});

【讨论】:

  • 谢谢你,但我希望 firebase 自动为每条消息生成 uid。所以我需要使用 push() 方法。我怎样才能做到?
  • 我明白了。然后你只需要检查databaseError 字段。因为要成功保存数据,它会像上面的示例一样返回null
  • 我想知道数据设计是否有问题。我应该将聊天字段放入用户字段吗?
  • 它仍然与NullPointerException 崩溃?
  • 它不应该崩溃。因为,已经检查了 null 值以避免崩溃。
【解决方案2】:

这是关于空变量的。 Firebase 代码运行良好。谢谢你。

【讨论】:

    猜你喜欢
    • 2023-03-04
    • 2019-12-15
    • 2021-11-12
    • 2013-08-05
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2019-01-01
    • 2010-11-07
    相关资源
    最近更新 更多