首页 > 解决方案 > 如何从android studio更新firebase中的用户数据

问题描述

所以基本上我创建了一个页面,用户可以在其中编辑他的姓名和电子邮件,但它不起作用,并且数据在 firebase 中保持不变。我尝试在 on-create 中调用更新函数,但这似乎不起作用我什至尝试直接在 on-create 中编写整个代码,但应用程序崩溃了,所以我决定创建函数 update() 并尝试了在点击时调用 update() 函数,但即使这样也没有用

这是我的代码

public class Profile extends AppCompatActivity {
    private FirebaseUser user;
    private DatabaseReference reference;
    private String userID;
    EditText Username,email;
    String name,mail;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile);
               Username=findViewById(R.id.Username1);
               email=findViewById(R.id.emailadress);
               button=findViewById(R.id.editinfo);
        user= FirebaseAuth.getInstance().getCurrentUser();
        reference= FirebaseDatabase.getInstance().getReference("Users");
        userID=user.getUid();
        reference.child("Driver").child(userID).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull  DataSnapshot snapshot) {
                Users usersnapshot=snapshot.getValue(Users.class);
                if(usersnapshot!=null){
                    String username=usersnapshot.getUsername();
                    String Email=usersnapshot.getMail();
                    String password=usersnapshot.getPassword();
                    Username.setText(username);
                    email.setText(Email);

                }
            }

            @Override
            public void onCancelled(@NonNull  DatabaseError error) {

            }
        });
        button.setOnClickListener(new android.view.View.OnClickListener() {
            @Override
            public void onClick(android.view.View v) {
      
            }
        });

    }
    public void update(){
        if(isNamechanged()||isEmailchanged()){
            Toast.makeText(this,"Data has been updated",Toast.LENGTH_LONG).show();
        }
    }
    public void onCancelled(@NonNull DatabaseError databaseError) { throw databaseError.toException(); }

    private boolean isEmailchanged() {
        if (!mail.equals(email.getText().toString())) {
            reference.child("Driver").child(userID).child("mail").setValue(email.getText().toString());
            mail=email.getText().toString();
            return true;
        } else {
            return false;
        }
    }
    private boolean isNamechanged() {
        if (!name.equals(Username.getText().toString())) {
            reference.child("Driver").child(userID).child("username").setValue(Username.getText().toString());
            name=Username.getText().toString();
            return true;
        }
        else {
            return false;
        }
    }



    }

这是我的数据库

{
  "Users" : {
    "Customer" : {
      "0awTFPGUkIdzAaZEgYZMmGv1zwk1" : {
        "mail" : "1@gmai.com",
        "username" : "1234"
      }
    },
    "Driver" : {
      "S04QBZx3PxYaLfDWBC3j3otM5ml1" : {
        "mail" : "m.yusuf7423@gmail.com",
        "username" : "YUSUF"
      }
    }
  }
}

现在我的应用程序开始崩溃,我在 logcat 中遇到了这个问题

Process: com.example.deliveryapp, PID: 12806
    java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference

编辑:在布局页面中,我添加了 On-click 选项来调用更新,所以现在它不会崩溃,也不会抛出任何错误,但现在什么都没有发生,就像我可以在这里单击按钮的声音一样(当有一个 onclick 功能)但什么都没有发生这是该按钮的布局

 <Button
        android:id="@+id/editinfo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="228dp"
        android:layout_marginLeft="228dp"
        android:layout_marginTop="456dp"
        android:onClick="update"
        android:text="edit"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

标签: javaandroidfirebase-realtime-database

解决方案


鉴于NullPointerException,似乎isEmailchangedorisNamechanged正在失败,因为mailorname为空。

这是有道理的,因为您没有在任何地方初始化nameandemail字段,所以第一次调用isEmailchangedor时isNamechanged,它们可能仍然为空,而您最终调用null.equals(...)会引发异常。

在这种情况下,由您决定您希望您的应用程序做什么,但一个简单的解决方法是检查 null:

private boolean isEmailchanged() {
    if (mail == null || !mail.equals(email.getText().toString())) {
        reference.child("Driver").child(userID).child("mail").setValue(email.getText().toString());
        mail=email.getText().toString();
        return true;
    } else {
        return false;
    }
}

private boolean isNamechanged() {
    if (name == null || !name.equals(Username.getText().toString())) {
        reference.child("Driver").child(userID).child("username").setValue(Username.getText().toString());
        name=Username.getText().toString();
        return true;
    }
    else {
        return false;
    }
}

推荐阅读