【问题标题】:how to check the current Firebase data under uid?如何查看uid下的当前Firebase数据?
【发布时间】:2022-02-06 23:49:27
【问题描述】:

我正在尝试从 firebase 实时数据库中检查 uid,但它只返回当前的 uid,当我尝试使用以前的 uid 检查 uid 时,它也只返回当前的 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”时,它只返回当前 uid

【问题讨论】:

  • 这段代码中到底有什么不符合您的预期?告诉我们共享代码有什么问题。你有什么错误吗?
  • 是的,每当我检查用户名时,使用此“FirebaseAuth.getInstance().getCurrentUser().getUid()”。我的代码仅在此 uid“OFtpR6bfISP3Odd9K1oGWCQmeEf2”下检查用户名,当我尝试检查此 uid 下的另一个用户名,例如“3l6RIm1ACacB4WOEiq5k7nrIk8b2”,但它仅在此“OFtpR6bfISP3Odd9K1oGWCQmeEf2”下检查。问题是我想在不同的 uid 下检查不同的用户名。你能帮帮我吗。@Alex Mamo
  • 你尝试获取其他用户价值的代码是什么
  • 这是代码“Query checkUser = reference.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).orderByChild("userName").equalTo(userEnteredUserName);" @Sambhav Khandelwal
  • 使用FirebaseAuth.getInstance().getCurrentUser().getUid() 时,您获取的是UID,而不是用户,对吧?那么你到底想得到什么?

标签: android firebase firebase-realtime-database firebase-authentication


【解决方案1】:

如果我理解正确,您是在尝试允许用户注册用户名并确保用户名是唯一的。但是,您当前的数据结构不允许您执行该查询。

Firebase 实时数据库只能对位于您查询位置的每个子节点下的固定路径的值进行排序/过滤。所以在你当前的代码中:

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);

我还建议您查看以下有关允许用户注册唯一用户名的问题:

【讨论】:

  • 感谢@Frank van Puffelen 的解释,但我有一个问题可以检查 uid Users 下的用户名:{ $uid:{ userName:......... } }
  • 一旦您修改了我的回答中显示的数据结构,这就是我回答中的Query checkUser = reference.orderByChild("userName").equalTo(userEnteredUserName); 所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 2018-07-16
  • 2022-01-17
  • 1970-01-01
  • 2022-11-11
  • 2021-08-24
相关资源
最近更新 更多