Android 如何级联ValueEventListeners以访问firebase实时数据库中的两个不同节点

Android 如何级联ValueEventListeners以访问firebase实时数据库中的两个不同节点,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,如何从android firebase实时数据库上的ValueEventListener()访问onDatachange,并在另一个ValueEventListener()中使用 在下面的代码中,您可以看到,第一个ValueEventListener()用于获取用户的UID,第二个ValueEventListener()将用于通过使用我们从第一个ValueEventListener()获取的UID访问用户详细信息节点中的特定值 但是在我得到UID之后,我无法访问userDetails节点,我得到

如何从android firebase实时数据库上的ValueEventListener()访问onDatachange,并在另一个ValueEventListener()中使用

在下面的代码中,您可以看到,第一个ValueEventListener()用于获取用户的UID,第二个ValueEventListener()将用于通过使用我们从第一个ValueEventListener()获取的UID访问用户详细信息节点中的特定值

但是在我得到UID之后,我无法访问userDetails节点,我得到了一个空指针异常

final String referralCodeTxt = ReferralCode.getText().toString().trim();

final DatabaseReference referralDB =FirebaseDatabase.getInstance().getReference();

referralDB.child("referralCodes").orderByValue().equalTo(referralCodeTxt).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if(dataSnapshot.exists()){
            for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
                final  String referrerUID = snapshot.getKey();
                checkReferrer.setText(referrerUID);
                referralDB.child("users").child(referrerUID).child("userDetails").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot ds) {
                        Users users = ds.getValue(Users.class);
                        String mPoints = users.getPoints().toString();
                        int refPoint = Integer.parseInt(mPoints) + 150;
                        referralDB.child("users").child(referrerUID).child("userDetails").child("points").setValue(refPoint);
                        Toast.makeText(SignUpActivity.this,"150 Points has been added to the Referrer", Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
        }else{
        }

在访问子级之前,请检查第二个dataSnapshot是否存在

values`databaseReference.child("referralCodes").orderByValue().equalTo(referralCodeTxt).addListenerForSingleValueEvent(new ValueEventListener() {

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                final String referrerUID = snapshot.getKey();
                checkReferrer.setText(referrerUID);

                databaseReference.child("users").child(referrerUID).child("userDetails").addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                            Users user = dataSnapshot.getValue(Users.class);
                            Integer refPoints = user.getPoints();

                            Integer newPoints = refPoints + 150;
                            Toast.makeText(SignUpActivity.this, "Old Points: " + refPoints, Toast.LENGTH_SHORT).show();
                            Toast.makeText(SignUpActivity.this, "New Points: " + newPoints, Toast.LENGTH_SHORT).show();

                            databaseReference.child("users").child(referrerUID).child("userDetails").child("points").setValue(newPoints);
                        }
                    }

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

                    }
                });
            }
        } else {
            Toast.makeText(SignUpActivity.this, "Error: Check referral code! ", Toast.LENGTH_SHORT).show();
            return;
        }

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