Как отправить пользовательскую ветку данных в Firebase?

#android #firebase #nullpointerexception #firebase-realtime-database

# #Android #firebase #исключение nullpointerexception #firebase-база данных в реальном времени

Вопрос:

Я создаю базу данных с такой веткой: введите описание изображения здесь

Я использую код для отправки в 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.

Комментарии:

1. Есть ли logcat для остановки приложения?

2. я обновил logcat в своем вопросе. в logcat указано, что в этом коде есть проблема.

3. Вы можете использовать Firebase console и импортировать ее в виде файла json, если это только на один раз.

4. @MohsenMirhoseiniArgi итак, если на данный момент у меня нет данных для добавления, я должен импортировать образец данных? это верно, братан?

5. Можно создать ветку во время выполнения.

Ответ №1:

Только setValue функция может выполнить эту работу за вас. Как только вы перейдете к указанному узлу и вызовете функцию setValue для этого узла, она автоматически создаст там ветку. Итак, вам нужно удалить push вызов функции.

Другое дело — проверить, есть ли databaseError поле null . Вот документация 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();

    }
});
 

Комментарии:

1. спасибо, но я хочу, чтобы firebase автоматически генерировала uid для каждого сообщения. поэтому мне нужно использовать метод push (). как я могу это сделать?

2. Понятно. Тогда вам просто нужно проверить databaseError поле. Потому что для успешного сохранения данных он вернется null , как в примере выше.

3. интересно, есть ли проблемы с дизайном данных. должен ли я поместить поле чата в поле пользователя?

4. Его все еще сбой с NullPointerException ?

5. Это не должно привести к сбою. Потому что значение null уже проверено, чтобы избежать сбоя.

Ответ №2:

Речь идет о переменной null. И код firebase работает нормально. Спасибо вам за это.