Java 检查字符串变量是否已修改,如果未修改,则检查Toast。但是吐司总是出现

Java 检查字符串变量是否已修改,如果未修改,则检查Toast。但是吐司总是出现,java,android,string,firebase,Java,Android,String,Firebase,我试图实现一些逻辑,以测试字符串变量是否被修改,但这些逻辑有一点问题。因此,在EditProfileActivity中,用户可以选择更改自己的姓名、用户名和简历。唯一的问题是,当他们输入EditProfileActivity时,如果用户名没有更改,那么当用户单击复选标记保存更改时,它会检查用户名是否已经存在于数据库中。如果是这样的话,就会出现一条消息,表明该用户名已经存在,您可以选择另一个用户名 问题是,如果用户没有更改任何内容,并单击复选标记,则会弹出Toast消息,因为用户没有更改的用户名显

我试图实现一些逻辑,以测试
字符串
变量是否被修改,但这些逻辑有一点问题。因此,在
EditProfileActivity
中,用户可以选择更改自己的
姓名、用户名和简历。唯一的问题是,当他们输入
EditProfileActivity
时,如果用户名没有更改,那么当用户单击复选标记保存更改时,它会检查用户名是否已经存在于数据库中。如果是这样的话,就会出现一条消息,表明该用户名已经存在,您可以选择另一个用户名

问题是,如果用户没有更改任何内容,并单击复选标记,则会弹出
Toast消息
,因为用户没有更改的用户名显然存在于数据库中

我如何更改代码或实现逻辑,以便即使用户单击复选标记,并且用户名未更改,也不会弹出
Toast消息
,只显示活动
finish()

我尝试在
updateProfile()中实现另一个条件
&&!mUsername.getText().toString().toLowerCase().equals(mUsername.toLowerCase())

EditProfileActivity

public class EditProfileActivity extends AppCompatActivity {

    ImageView mClose, mCheckmark, mImageProfile;
    TextView mChangePhoto;
    MaterialEditText mName, mUsername, mBio;

    private String mUsername1;

    FirebaseUser mFirebaseUser;

    private Uri mImageUri;
    StorageReference mStorageReference;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_edit_profile);

        mClose = findViewById(R.id.close);
        mCheckmark = findViewById(R.id.post_checkmark);
        mImageProfile = findViewById(R.id.image_profile);
        mChangePhoto = findViewById(R.id.text_view_change_profile_picture);
        mName = findViewById(R.id.fullname);
        mUsername = findViewById(R.id.username);
        mBio = findViewById(R.id.bio);

        mFirebaseUser = FirebaseAuth.getInstance().getCurrentUser();
        mStorageReference = FirebaseStorage.getInstance().getReference("uploads");

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(mFirebaseUser.getUid());
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                User user = dataSnapshot.getValue(User.class);
                if (user != null) {
                    mName.setText(user.getFullname());
                    mUsername.setText(user.getUsername().toLowerCase());
                    mBio.setText(user.getBio());
                    Glide.with(getApplicationContext()).load(user.getImageurl()).into(mImageProfile);
                }
            }

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

            }
        });

        mClose.setOnClickListener(v -> new AlertDialog.Builder(EditProfileActivity.this)
                .setTitle("Exit without saving changes?")
                .setPositiveButton("Yes", (dialog, which) -> {
                    finish();
                }).setNegativeButton("No", null).show());

        mChangePhoto.setOnClickListener(v -> CropImage.activity()
                .setAspectRatio(1, 1)
                .setCropShape(CropImageView.CropShape.OVAL)
                .start(EditProfileActivity.this));

        mImageProfile.setOnClickListener(v -> CropImage.activity()
                .setAspectRatio(1, 1)
                .setCropShape(CropImageView.CropShape.OVAL)
                .start(EditProfileActivity.this));

        mCheckmark.setOnClickListener(v -> {

            String str_name = mName.getText().toString();
            String str_username = mUsername.getText().toString();
            String str_bio = mBio.getText().toString();

            if (TextUtils.isEmpty(str_username) || TextUtils.isEmpty(str_bio) || TextUtils.isEmpty(str_name)) {
                Toast.makeText(this, "Please fill in all fields", Toast.LENGTH_SHORT).show();
            } else if (str_username.length() > 20) {
                Toast.makeText(this, "Username cannot contain more than 20 characters", Toast.LENGTH_SHORT).show();
            } else {
                updateProfile(mName.getText().toString(), mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
            }
        });
    }

    private void updateProfile(String fullname, String username, String bio) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(mFirebaseUser.getUid());

        mUsername1 = username.replaceAll("\\s+", "");
        mUsername1 = username.replaceAll("[^\\w]", "");

        DatabaseReference reference1 = FirebaseDatabase.getInstance().getReference("Users");
        reference1.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                boolean ifUserNameExists = false;
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    if (user != null) {
                        if (user.getUsername().equals(mUsername1.toLowerCase())) {
                            Toast.makeText(EditProfileActivity.this, "That username has already been taken. Try another", Toast.LENGTH_SHORT).show();
                            ifUserNameExists = true;
                        }
                    }
                }

                if (!ifUserNameExists) {
                    HashMap<String, Object> hashMap = new HashMap<>();
                    hashMap.put("fullname", fullname);
                    hashMap.put("username", mUsername1.toLowerCase());
                    hashMap.put("bio", bio);

                    reference.updateChildren(hashMap);
                    Toast.makeText(EditProfileActivity.this, "Username has been changed", Toast.LENGTH_LONG).show();
                    finish();
                }
            }

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

            }
        });
    }

这个解决方案对你有用吗

private User user;
从数据库中提取用户时,保存用户:

user = dataSnapshot.getValue(User.class);
在调用updateProfile()之前,检查username是否等于user.username

if(!user.username.equals(mUsername.getText().toString())){
    updateProfile(mName.getText().toString(), 
    mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
}

这样,您就不会对Firebase进行不必要的调用。

这是一种可行的逻辑


当用户输入
EditProfileActivity
时,您可能希望将从db检索到的用户信息保存到本地变量中。当用户单击复选标记保存更改时,您只需将用户输入与本地变量进行比较。如果它们不匹配,这意味着用户已经更改了他们的个人资料信息。

请发布一个数据库结构的屏幕截图以及您正在更改的值。@Dharmaraj好的,就发布它。如下所示
Users>uniqueId>username、name等
。我正在检查的值是username,我觉得若该字段的大小写处理不正确,这可能是一个问题。你能添加日志语句并检查这些值是否相同吗?@Dharmaraj谢谢你的帮助。下面的答案很好!酷。处理弦的情况可能会很痛苦:这不管用。它总是更改用户名,并且不会检查数据库中是否存在其他用户的用户名。嗯,这是为了防止在用户未更改用户名时调用Firebase。我认为您需要将toLowerCase()添加到if语句中。如果(!user.username.equals(mUsername.getText().toString().toLowerCase())不起作用,请尝试添加日志并进行调试,看看有什么不同。好的,这是有效的。如果用户名未更改,则没有Toast消息。。。谢谢嘿,伙计,我刚注意到其他字段有问题。EditProfile有Name、Username和Bio,您帮助我实现的代码现在只侦听用户名是否有更改,但我还需要它侦听Name和Bio的更改。因此,我尝试将代码更改为上面更新的部分,但没有成功。仍然只侦听用户名的更改。我如何解决这个问题?例如,如果我更改了密码,只是想更改个人信息而不是用户名,然后单击复选标记,它什么也不做。名字也一样。它只监听用户名,我实现了代码试图修复它,但没有起作用……我应该将它们保存为字符串变量还是其他什么?因为按照我现在的方式,从数据库中调用的数据填充了EditText空间。我是否应该将变量添加到字符串变量中?实际上,在复选标记的onClickListener中,我有
String str_username=mUsername.getText().toString()。我应该将新用户名与此用户名进行比较吗?
if(!user.username.equals(mUsername.getText().toString())){
    updateProfile(mName.getText().toString(), 
    mUsername.getText().toString().toLowerCase(), mBio.getText().toString());
}