#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 работает нормально. Спасибо вам за это.