firebase 如果我们有来自某个节点的数据,如何从该节点获取值

ix0qys7i  于 2022-11-17  发布在  其他
关注(0)|答案(1)|浏览(160)

我想做的是

  • 我有一个firebase节点,如下所示:

  • 我的用户将输入一个字符串(name),然后我将通过以下代码检查(name)或(userinput)在firebase中是否可用

DatabaseReference ref=FirebaseDatabase.getInstance().getReference().child("users");            
ref.orderByChild("username").equalTo(userinputname).addListenerForSingleValueEvent(new ValueEventListener(){
    @Override
    public void onDataChange(DataSnapshot dataSnapshot){
        if(dataSnapshot.exists()) {
            //username exist
            Toast.makeText(LoginActivity.this, "exists", Toast.LENGTH_SHORT).show();
   }     
}

如果它可用,那么我想从(名称)所在的特定节点获取其他数据。
简化-我的用户将输入一个用户名和密码,我有多个用户名和密码在我的数据库中,所以我想首先检查用户名是否存在于数据库中,如果是,那么我想让数据库中的密码与用户登录时输入的密码相匹配
例如,如果我的用户输入数据库中可用的用户名“Admin”,那么我想获取节点“Admin 123”中的通行证,然后我将检查数据库中的通行证是否与用户输入的通行证匹配,以便将其登录到应用程序中

35g0bw71

35g0bw711#

如果我的用户输入数据库中可用的用户名“Admin”,我希望获得该节点中的通行证,即“Admin 123”,然后我将检查数据库中的通行证是否与用户输入的通行证匹配,以便将其登录到应用程序中。
要解决此问题,首先必须执行一个查询,以获取username字段的值与用户在userinputname EditText中键入的内容相匹配的所有用户。如果查询至少返回一条记录,则必须根据userinputpass EditText值检查pass字段的值。如果存在匹配项,您可以继续进行身份验证,或者显示一条消息,或者执行任何您希望的操作。

DatabaseReference db = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = db.child("users");
Query queryByUserName = usersRef.orderByChild("username").equalTo(userinputname);
queryByUserName.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot userSnapshot : task.getResult().getChildren()) {
                String pass = userSnapshot.child("pass").getValue(String.class);
                if(pass.equals(userinputpass)) {
                    Log.d("TAG", "Username and password are correct.");
                } else {
                    Log.d("TAG", "The password is incorrect");
                }
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Never ignore potential errors!
        }
    }
});

在上面的解决方案中,我使用了Query#get()而不是Query()#addListenerForSingleValueEvent()。为什么?是因为this
虽然上面的解决方案可行,但请注意,您应该永远以您的方式存储用户凭据。永远不要!以明文存储密码是您可能给用户带来的最严重的安全风险之一。因此,为了避免这种情况,我强烈建议您实现Firebase Authentication
由于您使用的是Java,我建议您阅读以下文章:

如果您考虑在某个时间点学习Kotlin,这是我个人推荐的,那么也请查看以下资源:

还有:

上面的查询需要一个索引。因此为了使它工作,请在您的Firebase控制台中添加以下规则:

{
  "rules": {
    "users": {
      ".indexOn": "username"
    }
  }
}

相关问题