从Firebase Realtime数据库删除用户时,Android应用程序崩溃

时间:2019-09-18 14:46:28

标签: java android firebase firebase-realtime-database firebase-authentication

我正在开发我的应用程序,到目前为止,尽管存在一些小错误,该应用程序仍可以正常运行。用户可以登录,登录并更改其个人资料信息。在最后的步骤中,我添加了一个删除用户信息的功能。删除功能有效,因此用户信息从FirebaseAuth和FirebaseRealtimeDatabase中删除,但应用程序崩溃。 在我之前无法传递空值的问题之前,也许与问题有关。

更新:我更改了代码并尝试实施建议,但仍然崩溃...

Logcat:

09-18 16:28:20.474 23342-23342/com.example.login E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.login, PID: 23342
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.login.UserProfil.getVorname()' on a null object reference
    at com.example.login.ProfileActivity$1.onDataChange(ProfileActivity.java:59)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.0.0:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.0.0:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.0.0:55)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:234)
    at android.app.ActivityThread.main(ActivityThread.java:5526)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我的ProfileActivity的某些部分

 firebaseAuth=FirebaseAuth.getInstance();
    firebaseDatabase= FirebaseDatabase.getInstance();



    if (firebaseAuth.getCurrentUser() != null) {

        firebaseDatabase= FirebaseDatabase.getInstance();

        final DatabaseReference databaseReference = firebaseDatabase.getReference("Users").child(firebaseAuth.getUid());

        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
               if (dataSnapshot.exists()) ;
                {
                    UserProfil userProfil = dataSnapshot.getValue(UserProfil.class);
                    profilVorname.setText(userProfil.getVorname());
                    profilNachname.setText(userProfil.getNachname());
                    profilStrasse.setText(userProfil.getStrasse());
                    profilHNr.setText(userProfil.getHnr());
                    profilPlz.setText(userProfil.getPlz());
                    profilStadt.setText(userProfil.getStadt());
                    profilLand.setText(userProfil.getLand());
                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Toast.makeText(ProfileActivity.this, "Database Error", Toast.LENGTH_SHORT).show();
            }
        });
    }else{
        startActivity(new Intent(ProfileActivity.this,NavActivity.class));
    }

我UpdatProfilActivity的某些部分

loeschen.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            final DatabaseReference databaseReference = firebaseDatabase.getReference("Users").child(firebaseAuth.getUid());
            databaseReference.removeValue();
            FirebaseUser user= FirebaseAuth.getInstance().getCurrentUser();

            user.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
                @Override
                public void onComplete(@NonNull Task<Void> task) {
                    if(task.isSuccessful()){
                        // firebaseAuth.signOut();
                        // startActivity(new Intent(UpdateProfilActivity.this, MainActivity.class));
                        //finish();
                    }

                }
            });
        }
    });

2 个答案:

答案 0 :(得分:1)

使用addValueEventListener时,它将侦听每个事件的当前引用发生了什么。而当您将其删除时,侦听器中的dataSnapshot将为空,并在getVorname()上引发异常。

答案 1 :(得分:0)

这很可能是由于在删除时触发onDataChange()时'dataSnapshot'对象为null的原因;您可以返回是否为空

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (!dataSnapshot.exists())
                return;
            UserProfil userProfil = dataSnapshot.getValue(UserProfil.class);
            profilVorname.setText(userProfil.getVorname());
            profilNachname.setText(userProfil.getNachname());
            profilStrasse.setText(userProfil.getStrasse());
            profilHNr.setText(userProfil.getHnr());
            profilPlz.setText(userProfil.getPlz());
            profilStadt.setText(userProfil.getStadt());
            profilLand.setText(userProfil.getLand());

        }