如何查看uid下当前的Firebase数据?
how to check the current Firebase data under uid?
我正在尝试从 firebase 实时数据库检查 uid,但它只有 returns 当前 uid,当我尝试用以前的 uid 检查 uid 时,它也只有 returns 当前 uid。试了很多方法,也搜索了很多,都没有找到确切的解决办法,求大神指点。
这是我用来检查 uid 的东西
FirebaseAuth.getInstance().getCurrentUser().getUid();
这是我尝试检查的代码
String userEnteredUserName = binding.textLoginUserName.getEditText().getText().toString().trim();
String userEnteredPassword = binding.textPassword.getEditText().getText().toString().trim();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
Query checkUser = reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).orderByChild("userName").equalTo(userEnteredUserName);
Log.d("uids", "uid: " + uid);
checkUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
binding.textLoginUserName.setError(null);
binding.textLoginUserName.setErrorEnabled(false);
Log.d("users", "Username: " + snapshot.toString());
if (snapshot.exists()) {
String passwordFromDB = snapshot.child(userEnteredUserName).child("password").getValue(String.class);
if (passwordFromDB.equals(userEnteredPassword)) {
//next activity
}else{
Toast.makeText(Login.this, "Error", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(Login.this, "Error", Toast.LENGTH_SHORT).show();
}
});
记录我得到的,
2022-02-06 13:13:06.173 18093-18093/abc C/uids: uid: OFtpR6bfISP3Odd9K1oGWCQmeEf2
这是我的 firebase 数据,“aisha12”在当前 uid 下工作,但是当我尝试检查“vgbb”时,它 returns 只有当前 uid
如果我没理解错的话,你是在尝试让用户注册用户名并确保用户名是唯一的。不过,您当前的数据结构不允许您执行该查询。
Firebase 实时数据库只能 order/filter 位于您查询位置的每个子节点下的固定路径上的值。所以在你当前的代码中:
reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).orderByChild("userName").equalTo(userEnteredUserName);
您正在查询 /Users/$uid
的直接子节点,寻找那里的用户名。由于您在该路径中指定了 UID,因此您仅在该特定用户下进行搜索。
您当前的数据结构无法搜索所有 /Users
,因为您要查找的 属性 在 /Users/$uid/$username/userName
之下,因此 里面有两个个动态键,数据库只能处理一个动态键。
要允许查询,您需要更改数据结构并从中删除 $userName
级别,以便您获得:
Users: {
"3l6Rm....": {
"userName": "vgbb",
...
},
"OftpR...": {
"userName": "aisha12",
...
}
}
现在您可以通过以下方式搜索用户名:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
Query checkUser = reference.orderByChild("userName").equalTo(userEnteredUserName);
我还建议查看之前关于允许用户注册唯一用户名的问题:
- How do you prevent duplicate user properties in Firebase?
- How to check if usernames are unique in Firebase
- How to give unique usernames from a list of usernames to the users in the firebase
我正在尝试从 firebase 实时数据库检查 uid,但它只有 returns 当前 uid,当我尝试用以前的 uid 检查 uid 时,它也只有 returns 当前 uid。试了很多方法,也搜索了很多,都没有找到确切的解决办法,求大神指点。
这是我用来检查 uid 的东西
FirebaseAuth.getInstance().getCurrentUser().getUid();
这是我尝试检查的代码
String userEnteredUserName = binding.textLoginUserName.getEditText().getText().toString().trim();
String userEnteredPassword = binding.textPassword.getEditText().getText().toString().trim();
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
Query checkUser = reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).orderByChild("userName").equalTo(userEnteredUserName);
Log.d("uids", "uid: " + uid);
checkUser.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
binding.textLoginUserName.setError(null);
binding.textLoginUserName.setErrorEnabled(false);
Log.d("users", "Username: " + snapshot.toString());
if (snapshot.exists()) {
String passwordFromDB = snapshot.child(userEnteredUserName).child("password").getValue(String.class);
if (passwordFromDB.equals(userEnteredPassword)) {
//next activity
}else{
Toast.makeText(Login.this, "Error", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(Login.this, "Error", Toast.LENGTH_SHORT).show();
}
});
记录我得到的,
2022-02-06 13:13:06.173 18093-18093/abc C/uids: uid: OFtpR6bfISP3Odd9K1oGWCQmeEf2
这是我的 firebase 数据,“aisha12”在当前 uid 下工作,但是当我尝试检查“vgbb”时,它 returns 只有当前 uid
如果我没理解错的话,你是在尝试让用户注册用户名并确保用户名是唯一的。不过,您当前的数据结构不允许您执行该查询。
Firebase 实时数据库只能 order/filter 位于您查询位置的每个子节点下的固定路径上的值。所以在你当前的代码中:
reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).orderByChild("userName").equalTo(userEnteredUserName);
您正在查询 /Users/$uid
的直接子节点,寻找那里的用户名。由于您在该路径中指定了 UID,因此您仅在该特定用户下进行搜索。
您当前的数据结构无法搜索所有 /Users
,因为您要查找的 属性 在 /Users/$uid/$username/userName
之下,因此 里面有两个个动态键,数据库只能处理一个动态键。
要允许查询,您需要更改数据结构并从中删除 $userName
级别,以便您获得:
Users: {
"3l6Rm....": {
"userName": "vgbb",
...
},
"OftpR...": {
"userName": "aisha12",
...
}
}
现在您可以通过以下方式搜索用户名:
DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
Query checkUser = reference.orderByChild("userName").equalTo(userEnteredUserName);
我还建议查看之前关于允许用户注册唯一用户名的问题:
- How do you prevent duplicate user properties in Firebase?
- How to check if usernames are unique in Firebase
- How to give unique usernames from a list of usernames to the users in the firebase