首页 > 解决方案 > 在实时数据库 Android Studio Java 中更改值

问题描述

所以基本上我的问题有点奇怪。但是它会更新值,我需要再次关闭应用程序才能再次更新字段。这是我的更新代码。

saveEditProfile_studentbtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
                String studentUser = firebaseAuth.getCurrentUser().getUid();

                final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(studentUser);
                Toast.makeText(StudentProfileEditAct.this, studentUser, Toast.LENGTH_SHORT).show();
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {
                        String replaceName = studentChangeFullName.getText().toString().trim();
                        String replacePhoneNumber = studentChangePhoneNum.getText().toString().trim();
                        Map<String, Object> updates = new HashMap<>();
                        updates.put("fullName", replaceName);
                        updates.put("phoneNumber", replacePhoneNumber);

                        databaseReference.updateChildren(updates);
                        Toast.makeText(StudentProfileEditAct.this, "Changes has been made", Toast.LENGTH_SHORT).show();
                    }

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

                    }
                });

            }
        });

这是我的实时数据库。我只是想更改姓名和电话号码。但是出于某种奇怪的原因,它会注销当前用户并重新登录,当我尝试更新值时,实时值(全名,电话号码)数据会从旧值和新值返回并突出显示作为黄色。

[1]:https://i.stack.imgur.com/wdn4S.png

在此处输入图像描述 在此处输入图像描述

当我在没有先关闭应用程序的情况下第二次尝试更新时,下面的图像。

标签: androidfirebase-realtime-database

解决方案


如果要根据当前值更新数据库中的值,则应使用事务来防止写入冲突。

但是在您的代码中,我认为没有理由在更新之前先读取用户节点。您可以使用这个更简单的代码,它可以解决您的问题:

public void onClick(View v) {
    FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
    String studentUser = firebaseAuth.getCurrentUser().getUid();

    final DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users").child(studentUser);
    String replaceName = studentChangeFullName.getText().toString().trim();
    String replacePhoneNumber = studentChangePhoneNum.getText().toString().trim();
    Map<String, Object> updates = new HashMap<>();
    updates.put("fullName", replaceName);
    updates.put("phoneNumber", replacePhoneNumber);

    databaseReference.updateChildren(updates);
    Toast.makeText(StudentProfileEditAct.this, "Changes has been made", Toast.LENGTH_SHORT).show();
}

推荐阅读