【问题标题】:how to compare data from Firebase database with data entered from Android如何将 Firebase 数据库中的数据与 Android 输入的数据进行比较
【发布时间】:2021-05-12 22:57:38
【问题描述】:

我正在创建一个使用带有 ID 和密码的数字的系统。我想对比一下edittext中输入的数据是否与firebase实时数据库中存储的数据相匹配。

firebase 结构:

"password" : {
   12345 : 1111,
   54321 : 2222
}

12345 和 54321 是 ID,1111 和 2222 是密码。

java代码:

@Override
public void onClick(View view) {
   FirebaseDatabase.getInstance().getReference().addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
         if (dataSnapshot.exists()) {
             String server_data_User = dataSnapshot.child("password").getKey();
             Log.d("PWActivity", "ValueEventListener : " + server_data_User);

             String server_data_PW = dataSnapshot.child("password").getValue(String.class);
             Log.d("PWActivity", "ValueEventListener : " + server_data_PW);

             String EditText_user = editText.getText().toString();
             String server_user = server_data_User;

             String EditText_pw = editText.getText().toString();
             String server_pw = server_data_PW;

             if (EditText_user.equals(server_user) && EditText_pw.equals(server_pw))
                 {
                     Intent intent = new Intent(PWActivity.this, SubActivity.class);
                     startActivity(intent);

                 } else {
                 textView.setText("incorrect");
                 editText.setText("");
                 }
          }
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
      }
   });
}

例如,如果我输入 12345 和 1111,这些数字与 Firebase 实时数据库中的数据相同,因此必须转到下一个屏幕。但即使我输入了正确的数据,它也会回到第一个屏幕。我想知道如何解决这个问题,或者如何将输入的数据与 firebase 中的数据进行对比。 我试图自己解决,但不幸的是我失败了......我希望你帮我解决这个问题......

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    最好只加载您实际需要的数据,在本例中为/password/$user。所以你的代码是:

    FirebaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    FirebaseReference passwordRef = rootRef.child("password");
    
    String EditText_user = editText.getText().toString();
    String EditText_pw = editText.getText().toString();
    
    FirebaseReference userRef = passwordRef.child(EditText_user);
    userRef.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
         if (dataSnapshot.exists()) {
             String server_data_PW = dataSnapshot.getValue(String.class);
    
             if (EditText_pw.equals(server_data_PW)) {
                 Intent intent = new Intent(PWActivity.this, SubActivity.class);
                 startActivity(intent);
    
             } else {
                 textView.setText("incorrect");
                 editText.setText("");
             }
          }
      }
    
      @Override
      public void onCancelled(DatabaseError databaseError) {
          throw databaseError.toException(); // never ignore errors
      }
    

    【讨论】:

    • 如果服务器上存在密码,即使ID和密码不匹配,该代码也会被无条件批准。你知道如何找到与输入数据同名的节点吗?我尝试使用equalTo(),但没有成功。
    • 这种行为听起来不太可能。您是否已经在if (dataSnapshot.exists()) { 上设置了断点、在调试器中运行并单步执行代码?它到达那里了吗?快照是否存在,即使您输入了不存在的用户?在那种情况下它会进入密码检查吗?
    • 我调试后发现'DataSnapshot {key = EditText_pw, value = null}'...
    • 听起来您的数据库中有一个名为 EditText_pw 的键/属性,这不是您问题中的 JSON 的样子。请确保我们可以看到您使用的确切数据。
    • 变量名有错误...我修复了它,它成功了!谢谢!
    猜你喜欢
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多