【问题标题】:Fetch and Compare Key and Value from Firebase Realtime Database从 Firebase 实时数据库中获取并比较键和值
【发布时间】:2018-10-15 12:18:21
【问题描述】:

我正在尝试制作一个用户存储他的数据的应用程序。我已经使用用户共享首选项来保存用户登录详细信息,但仍然出于安全目的,我做了一个活动(验证密码活动),要求用户密码允许访问数据。现在我可以保存、获取和删除数据了。但是在我的验证密码活动中,我只想获取存储密码的特定键和值。我不想在验证密码活动中获取完整数据。

以下是我用来将密码保存到数据库的代码:-

databaseReference.child(uniqueID).setValue(passcode);

下面是我试图只获取密码的代码:-

dbreference.child(uniqueID).orderByChild("passcode").equalTo(pass).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()){
            Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
        }else{
            Toast.makeText(getApplicationContext(), "Data doesn't exist", Toast.LENGTH_LONG).show();
        }
    }

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

    }
});

这里uniqueID"abhishek88666kumar"pass 是用于getText() 的变量。

这是我的 Firebase 数据库的屏幕截图:-

Database Screenshot

这是验证密码活动截图:-

请查看数据库截图和验证密码活动截图。

议程:

  1. getText() 从 textView 内部活动。

  2. 从 firebase 实时数据库中获取值(仅适用于当前用户。在我们的例子中为“abhishek88666kumar”)。

  3. 比较 1 和 2 是否相同。 (如果相同则重定向到 MainActivity 否则显示错误。)

请告诉我我做错了什么。

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    感谢大家的帮助 :) 您的回答对我不起作用,但在您的回答和我的知识的帮助下,我自己为我的问题找到了解决方案。 这是符合我要求的代码。这段代码的工作方式正是我想要的。

    dbreference = FirebaseDatabase.getInstance().getReference("passcodes");
                        Query query = dbreference.orderByKey().equalTo(currentUser); //current user is "abhishek88666kumar" in this case.
                        query.addListenerForSingleValueEvent(new ValueEventListener() {
                            @Override
                            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()){
                                    String passcode = txtPasscode.getText().toString;//Passcode is 1234 in this case.
                                    String fetchedValue = "";
                                    for (DataSnapshot snap : dataSnapshot.getChildren()){
                                        fetchedValue = (String) snap.getValue();
                                    }
                                    if (!passcode.equals(fetchedValue)){
                                        Toast.makeText(getApplicationContext(), "Passcode doesn't match.", Toast.LENGTH_LONG).show();
                                    }else{
                                        Toast.makeText(getApplicationContext(), "Passcode matched.", Toast.LENGTH_LONG).show();
                                    }
                                }else{
                                    Toast.makeText(getApplicationContext(), "No passcode found for this user", Toast.LENGTH_LONG).show();
                                }
                            }
    
                            @Override
                            public void onCancelled(@NonNull DatabaseError databaseError) {
    
                            }
                        });
    

    【讨论】:

      【解决方案2】:

      假设pass 是一个类似1234 的值,这一行:

      dbreference.child(uniqueID).orderByChild("passcode").equalTo(pass).addListenerForSingleValueEvent(...
      

      应该是:

      FirebaseDatabase.getInstance().getReference("passcodes").orderByValue().equalTo(pass).addListenerForSingleValueEvent(...
      

      这样DataSnapshot 将包含passcodes 的所有子节点,其值为1234,即JSON 示例中的"abhishek88666kumar"

      还请务必学习documentation on sorting and filtering data

      【讨论】:

      • 感谢您抽出时间回复。请查看更新的数据库屏幕截图。现在在我的数据库中,我们总共有 4 个用户密码。其中,两个用户“abhishek88666kumar”和“rohit88666kumar”具有相同的密码。因此,如果我使用您提供的代码,那么数据库将检查“密码”的值 1234,但因为它有两个具有相同密码的用户,它可能会影响验证。另外,假设“abhishek88666kumar”密码是1234,但他输入了3328,这是kalpeshchaudhary8的密码。在这种情况下,数据库将返回true,因为数据库有3328。怎么办?
      • 抱歉,我不确定我是否理解您的问题。在 Firebase 中,密钥 abhishek88666kumar 与用户无关,任何用户都可以轻松欺骗。
      【解决方案3】:

      这是比较 Firebase 数据的第一种方法。

      btnSave.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      passcode = editText.getText().toString();
      
                      Toast.makeText(getApplicationContext(), "Data :"+passcode, Toast.LENGTH_LONG).show();
      
                      DatabaseReference ref = FirebaseDatabase.getInstance().getReference("passcode");
                     Query applesQuery = ref.orderByValue().equalTo(passcode);
      
                      applesQuery.addListenerForSingleValueEvent(new ValueEventListener() {
                          @Override
                          public void onDataChange(DataSnapshot dataSnapshot) {
      
      
                              if (dataSnapshot.exists()){
      
                                  Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
                              }else{
                                  Toast.makeText(getApplicationContext(), "Data doesn't exist"+passcode, Toast.LENGTH_LONG).show();
                              }
                          }
      
                          @Override
                          public void onCancelled(DatabaseError databaseError) {
                              // Log.e(TAG, "onCancelled", databaseError.toException());
                          }
                      });
      
                  }
              });
      

      这是比较 Firebase 数据的第二种方法。

      btnSave.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
      
                  check = editText.getText().toString();
      
                  Toast.makeText(getApplicationContext(), "Data :"+check, Toast.LENGTH_LONG).show();
      
                  DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("passcode");
                 // Query applesQuery = ref.child("Customers").orderByChild("abhishek88666kumar").equalTo(passcode);
      
                  ref.addListenerForSingleValueEvent(new ValueEventListener() {
                      @Override
                      public void onDataChange(DataSnapshot dataSnapshot) {
      
                          Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
                          if(map.get("abhishek88666kumar")!=null){
                              passcode = map.get("abhishek88666kumar").toString();
      
                              if (passcode.equals(check))
                              {
                                  Toast.makeText(getApplicationContext(), "Data exist", Toast.LENGTH_LONG).show();
                              }
                              else{
      
      
                                  Toast.makeText(getApplicationContext(), "Data doesn't exist"+check, Toast.LENGTH_LONG).show();
                              }
      
                          }
      
                      }
      
                      @Override
                      public void onCancelled(DatabaseError databaseError) {
                          // Log.e(TAG, "onCancelled", databaseError.toException());
                      }
                  });
      
              }
          });
      

      两者都在工作。 希望对你有帮助。 谢谢。

      【讨论】:

        猜你喜欢
        • 2018-02-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-06
        • 2019-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        相关资源
        最近更新 更多