Android Studio中使用DatabaseReference实现实时数据库登录功能异常

你的代码存在两个关键问题,直接导致不管密码对错都会跳转到Tasks.class:
1. 密码匹配逻辑完全写反
原代码里用了!Objects.equals(userPassword, userPasswordFromDB)作为判断条件,意思是输入密码和数据库密码不一致时执行跳转,这和注释标注的"Password matches"完全相反,是密码错误仍跳转的核心原因。
2. 快照取值方式错误
orderByChild("email").equalTo(email)返回的是包含所有匹配邮箱节点的快照,直接调用snapshot.child("password")无法正确获取到目标用户的密码,必须遍历子节点才能拿到对应数据。
修复后的完整代码
public void checkUserFromDB(){ String email = String.valueOf (Email.getText ()).trim (); String userPassword = String.valueOf (Password.getText ()).trim (); Query query = databaseReference.orderByChild ("email").equalTo (email); query.addListenerForSingleValueEvent (new ValueEventListener () { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { Email.setError(null); // 遍历匹配到的用户节点 for (DataSnapshot userSnapshot : snapshot.getChildren()) { String userPasswordFromDB = userSnapshot.child("password").getValue(String.class); if (Objects.equals(userPassword, userPasswordFromDB)) { // 密码匹配,跳转页面 Password.setError(null); startActivity(new Intent(getApplicationContext(), Tasks.class)); finish(); } else { // 密码不匹配,提示错误 Password.setError("Password does not match."); Password.requestFocus(); } } } else { Email.setError("Username aren't exists, please open a new account."); Email.requestFocus(); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); }
内容的提问来源于stack exchange,提问作者AdirMor
相关产品推荐
相关产品推荐

