Android 不能正确地理解一个意图

Android 不能正确地理解一个意图,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我必须检查用户输入的代码与数据库代码是否有效。如果是,则应填充从firebase数据库到布局中所有字段的所有详细信息。否则,它应该返回主页,向未经授权的用户敬酒 问题是,即使用户输入的代码与数据库代码匹配,它也会将我带到主页。我怎样才能解决这个问题?谁能指引我 我的onCreate方法中的代码: inputCodesReference.addValueEventListener(new ValueEventListener() { @Override public void onData

我必须检查用户输入的代码与数据库代码是否有效。如果是,则应填充从firebase数据库到布局中所有字段的所有详细信息。否则,它应该返回主页,向未经授权的用户敬酒

问题是,即使用户输入的代码与数据库代码匹配,它也会将我带到
主页
。我怎样才能解决这个问题?谁能指引我

我的onCreate方法中的代码:

inputCodesReference.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
      enteredUserCode = (String) ds.child("code").getValue();
    }
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {}
});

familyListReference.addListenerForSingleValueEvent(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
      String key = (String) ds.getKey();
      DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("familylist").child(key);
      keyReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
          final String code = dataSnapshot.child("code").getValue(String.class);
          String family = dataSnapshot.child("family").getValue(String.class);
          String father = dataSnapshot.child("fatherName").getValue(String.class);
          String mother = dataSnapshot.child("motherName").getValue(String.class);

          for (DataSnapshot childSnapshot: dataSnapshot.child("children").getChildren()) {
            String child = childSnapshot.getValue(String.class);
            if (code.equals(enteredUserCode))
              children.add(child);
          }

          if (code.equals(enteredUserCode)) {
            Log.d(TAG, "[FINAL CHECK IN ACTIVITY] Database Code: " + code);
            Log.d(TAG, "[FINAL CHECK IN ACTIVITY] User Input code: " + enteredUserCode);
            familyName = family;
            fatherName = father;
            motherName = mother;
            relativeLayout.setVisibility(View.VISIBLE);
            welcomeMessage.setText("Welcome " + familyName + " family!");
            fatherRadioButton.setText(fatherName);
            motherRadioButton.setText(motherName);
          } else {
            Intent intent = new Intent(getApplicationContext(), HomePage.class);
            startActivity(intent);
            finish();
          }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
          Log.d(TAG, "Read failed");
        }
      }); // [Key Reference]

    } // END of for Loop
  }

  @Override
  public void onCancelled(DatabaseError databaseError) {
    Log.d(TAG, "Read failed");
  }
}); // [familyList Database Reference]


//[CHECK IN]
checkinButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
      if (fatherRadioButton.isChecked()) {
        checkIn = new CheckIn(familyName, fatherName, null, checkInTime, childrenToDatabase);
      } else {
        checkIn = new CheckIn(familyName, null, motherName, checkInTime, childrenToDatabase);
      }
      checkInCheckOutDatabaseReference.push().setValue(checkIn);
      Intent intent = new Intent(CheckInFinalActivity.this, HomePage.class);
      startActivity(intent);
      Toast.makeText(CheckInFinalActivity.this, "Check in Successful!", Toast.LENGTH_LONG).show();
    }
  }
});

每当从
firebase
检索
DataSnapshot
时,就会执行
onDataChange
方法中的
enteredUserCode
行,因为该调用本质上是
异步的

因此,
enteredUserCode
此时可能无法用于
familylistereference
。要确保
enteredUserCode
可用,您需要将
familyListReference的
侦听器移动到
inputCodeReference
onDataChange
方法中

这是修改后的代码

inputCodesReference.addValueEventListener(new ValueEventListener() {
  @Override
  public void onDataChange(DataSnapshot dataSnapshot) {
    for (DataSnapshot ds: dataSnapshot.getChildren()) {
      enteredUserCode = (String) ds.child("code").getValue();
    }
    familyListReference.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds: dataSnapshot.getChildren()) {
          String key = (String) ds.getKey();
          DatabaseReference keyReference = FirebaseDatabase.getInstance().getReference().child("familylist").child(key);
          keyReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
              final String code = dataSnapshot.child("code").getValue(String.class);
              String family = dataSnapshot.child("family").getValue(String.class);
              String father = dataSnapshot.child("fatherName").getValue(String.class);
              String mother = dataSnapshot.child("motherName").getValue(String.class);

              for (DataSnapshot childSnapshot: dataSnapshot.child("children").getChildren()) {
                String child = childSnapshot.getValue(String.class);
                if (code.equals(enteredUserCode))
                  children.add(child);
              }

              if (code.equals(enteredUserCode)) {
                Log.d(TAG, "[FINAL CHECK IN ACTIVITY] Database Code: " + code);
                Log.d(TAG, "[FINAL CHECK IN ACTIVITY] User Input code: " + enteredUserCode);
                familyName = family;
                fatherName = father;
                motherName = mother;
                relativeLayout.setVisibility(View.VISIBLE);
                welcomeMessage.setText("Welcome " + familyName + " family!");
                fatherRadioButton.setText(fatherName);
                motherRadioButton.setText(motherName);
              } else {
                Intent intent = new Intent(getApplicationContext(), HomePage.class);
                startActivity(intent);
                finish();
              }
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
              Log.d(TAG, "Read failed");
            }
          }); // [Key Reference]

        } // END of for Loop
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, "Read failed");
      }
    }); // [familyList Database Reference]
  }
  @Override
  public void onCancelled(DatabaseError databaseError) {}
});

//[CHECK IN]
checkinButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
      if (fatherRadioButton.isChecked()) {
        checkIn = new CheckIn(familyName, fatherName, null, checkInTime, childrenToDatabase);
      } else {
        checkIn = new CheckIn(familyName, null, motherName, checkInTime, childrenToDatabase);
      }
      checkInCheckOutDatabaseReference.push().setValue(checkIn);
      Intent intent = new Intent(CheckInFinalActivity.this, HomePage.class);
      startActivity(intent);
      Toast.makeText(CheckInFinalActivity.this, "Check in Successful!", Toast.LENGTH_LONG).show();
    }
  }
});
这可确保输入的
已准备就绪并可用于下一步操作


现在您有了一个方法,可以通过获得
rootFirebaseInstance
而不是添加两个侦听器来进一步简化代码。这取决于你如何组织你的
json
模式。

你确定你没有在其他地方调用
startActivity
?此Firebase侦听器是一个异步调用。添加更多代码将有助于诊断。检查用户的读写权限问题与读写无关。这是关于将用户带到正确的意图@sivaYes,我在checkIn按钮的
onClick
方法中使用
startActivity()
。我添加了onCreate方法代码。请检查以上更新的问题@Krishnakalubandik,如果我正确理解了流程,用户输入一个
code
,然后单击
checkInButton
。然后要验证
代码
,然后根据
代码
的正确性重定向到活动。我说的对吗?这对我不合适。当我添加这个时,循环继续,应用程序被挂起(我稍微修改了代码。你试过最新的代码吗?我可以通过github给你这个源代码吗?你能看一次吗?那太好了。一定要给我链接,你可以看这里!请参考这个