-1

How can i access onDatachange from a ValueEventListener() with in another ValueEventListener() on firebase realtime database from android.

On the below code you can see,the first ValueEventListener() is used to get the UID of the user and the second ValueEventListener() will be used to access the specific value with in the user details node by using the UID which we get from the first ValueEventListener().

But after i get the UID, i could not get access the userDetails node,i get a null pointer exception.

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{
        }

Mega_Mere
  • 33
  • 8

1 Answers1

1

Check if the second dataSnapshot exists before accessing the child

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) {
    }
});
Wai Ha Lee
  • 8,598
  • 83
  • 57
  • 92
Mega_Mere
  • 33
  • 8