java - 如何从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" />
解决方案
鉴于NullPointerException
,似乎isEmailchanged
orisNamechanged
正在失败,因为mail
orname
为空。
这是有道理的,因为您没有在任何地方初始化name
andemail
字段,所以第一次调用isEmailchanged
or时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;
}
}
推荐阅读
- tableau-api - Tableau-如何将数据查找到具有重复值的表中并基于筛选器的最新日期
- python - 如何自动从周围环境中提取图像?
- java - 如何在 Jenkins 中设置 AWS 凭证?
- groovy - 没有这样的属性:类的 api:groovy.lang.Binding 错误
- javascript - 为什么当我使用代码但在 codepen 上工作时,anime.js 示例不起作用?
- c++ - Qt/C++ 连接经典蓝牙设备
- python - 在没有条件语句的情况下在 python 中实现重载函数的最佳方法是什么?
- python-3.x - ValueError:检查输入时出错:预期 lstm_10_input 的形状为 (679, 1) 但得到的数组的形状为 (1, 1)
- c++ - 如何确定 QTextCodec 是否与 ASCII 兼容?
- python - 加快从 pandas 数据帧到 mysql 的数据插入