Как я могу использовать данные, которые извлекаются из базы данных Firebase в реальном времени, чтобы их можно было использовать в другом месте, кроме процедуры onChildAdded? - PullRequest
0 голосов
/ 18 марта 2020

Итак, я разрабатываю простое приложение чата, и я хочу добавить значение из моей базы данных, и оно будет сохранено Test Object, как показано в Login * 1004. * process.

База данных в реальном времени

{
  "Message" : {
    "null_UserA" : {
      "-M2DtFhvy_JPWMDkZI4L" : {
        "Pengguna" : "<expected Nama>",
        "Pesan" : "<Message>"
      }
    }
    }
  },
  "Users" : {
    "1TAOY5pLmwXBhrce9FcWy3wuFFS2" : {
      "Name" : "UserA",
      "email" : "useremail"
    }
  }
}

Test. java

package com.bruh.chatapp;

import java.io.Serializable;

import androidx.annotation.Keep;

@Keep
public class Test implements Serializable {
    static String Nama = "";

    Test(){

    }

    public Test(String Nama){
        this.Nama = Nama;
    }

    public static String getNama() {
        return Nama;
    }

    public static void setNama(String nama) {
        Nama = nama;
    }
}

Логин

auth.signInWithEmailAndPassword(user,pass).addOnCompleteListener(Masuk.this, new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {
                            if(task.isSuccessful()){
                                uid = auth.getCurrentUser().getUid();
                                reference = getDatabase.getReference("Users").child(uid);
                                reference.addChildEventListener(new ChildEventListener() {
                                    @Override
                                    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                                        for(DataSnapshot ff : dataSnapshot.getChildren()){
                                             Test Pesan = ff.getValue(Test.class);
                                        }

                                    }

                                });

И тогда значение объекта, полученное из Структура базы данных , будет использоваться Процессом чата ниже

Процесс чата

 firebaseDatabase = FirebaseDatabase.getInstance();

        final DatabaseReference reference1 = firebaseDatabase.getReference("Message/"+ Test.Nama+"_"+Pesan.chatWith);
        final DatabaseReference reference2 = firebaseDatabase.getReference("Message/"+ Pesan.chatWith+"_"+Test.Nama);



        kirim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String isiPesan = ketikPesan.getText().toString();
                if(!isiPesan.equals("")){
                    Map<String,String> messageTextBody = new HashMap<String,String>();
                    messageTextBody.put("Pesan",isiPesan);
                    messageTextBody.put("Pengguna", Test.Nama);
                    reference1.push().setValue(messageTextBody);
                    reference2.push().setValue(messageTextBody);
                    ketikPesan.setText("");
                }
            }
        });

        reference1.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                Map<String,String> map = (Map<String,String>) dataSnapshot.getValue();
                String pesan = map.get("Pesan").toString();
                String pengguna = map.get("Pengguna").toString();

                if(pengguna.equals(Test.Nama)){
                    addMessageBox(pesan, 1);
                }else{
                    addMessageBox(pesan, 2);
                }
            }

Но проблема в том, что значение Объекта, к несчастью полученное, равно> нулевому значению, затем отображается это сообщение об ошибке

Сообщение об ошибке

    Process: com.bruh.chatapp, PID: 2604
    java.lang.NullPointerException
        at com.bruh.chatapp.Obrol$2.onChildAdded(Obrol.java:86)
        at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:79)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5019)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

Как получить данные, извлеченные из базы данных реального времени, и использовать их в другом месте, кроме процедуры onChildAdded?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...