Ciaránimo
Ciaránimo

Reputation: 537

Firebase DataSnapshot Null values

My app allows you to add a Player to a node, once they have been added I am using the below method to search by phoneNum to see if that player exists in the 'users' node.

Where I am having trouble is that I need to be able to access the values from the datasnapshot for the user within the found matching node. e.g.return the value of the user id. When I attempt this it keeps showing as a null value and when I try to log to the console it complains that it is a null value which doesn't make sense as the if statement should take care of this.

The method is able to find if a player exists in the the users node and displays a Toast message to indicate this.

Data Structure

Code:

public void checkPlayerNum(final String phoneNum) {
        DatabaseReference mDatabaseReference =


         FirebaseDatabase.getInstance().getReference().child("users");

    if (!TextUtils.isEmpty(phoneNum)) {
        final Query phoneNumReference = mDatabaseReference.orderByChild("phoneNum").equalTo(phoneNum);

        ValueEventListener phoneNumValueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.getValue() != null) {
                   // String key = String.valueOf(dataSnapshot.getValue());
                   User mUser = dataSnapshot.getValue(User.class);

                    String uId = mUser.getUid();

                  //  Log.d("TAG",uId);
                    Toast.makeText(getApplicationContext(), "* found **"+ uId , Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(getApplicationContext(), "****NOT FOUND****", Toast.LENGTH_LONG).show();
                }
            }

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

        phoneNumReference.addListenerForSingleValueEvent(phoneNumValueEventListener);


    } else {
        Log.e("Error","phoneNum is null");
    }
}

Upvotes: 1

Views: 8122

Answers (3)

Ciaránimo
Ciaránimo

Reputation: 537

Thanks everybody I managed to achieve it by using childEventListener

public void checkingNumber(final String phoneNum){
    DatabaseReference mDatabaseReference =
            FirebaseDatabase.getInstance().getReference().child("users");
    final Query query = mDatabaseReference;
    query.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            if (dataSnapshot.getValue() != null) {
                // String key = String.valueOf(dataSnapshot.getValue());
                User mUser = dataSnapshot.getValue(User.class);

               // String uId = mUser.getUid();
                // usersDatabase.child(mUser.getUid());
                 // Log.d("TAG",uId);
                if(mUser.getPhoneNum().equals(phoneNum)) {
                   String uId= mUser.getUid();
                    String email = mUser.getEmail();
                    String name = mUser.getName();
                    Toast.makeText(getApplicationContext(), "* found **" + " " + uId + " " + " " + email + " " + name, Toast.LENGTH_LONG).show();
                }
            } else {
                Toast.makeText(getApplicationContext(), "****NOT FOUND****", Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

Upvotes: 0

Mohamed Nageh
Mohamed Nageh

Reputation: 2043

you need to do this at two steps , first check if the user exists. then you get user info by your userId.

DatabaseReference mDatabaseReference;

public void checkPlayerNum(final String phoneNum,final String userId) {
             mDatabaseReference = 
                FirebaseDatabase.getInstance().getReference().child("users");

        if (!TextUtils.isEmpty(phoneNum)) {
            final Query phoneNumReference = mDatabaseReference.orderByChild("phoneNum").equalTo(phoneNum);

            ValueEventListener phoneNumValueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if (dataSnapshot.getValue() != null) {
                        // user exists 
                        getUserInf(userId);

                    } else {
                        Toast.makeText(getApplicationContext(), "****NOT FOUND****", Toast.LENGTH_LONG).show();
                    }
                }

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

            phoneNumReference.addListenerForSingleValueEvent(phoneNumValueEventListener);


        } else {
            Log.e("Error","phoneNum is null");
        }
    }

get user info by userId. mDatabaseReference is the same as before . define it as member field .

     void getUserInf(String userId) {
            userValueEventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // get user data
                   User mUser = dataSnapshot.getValue(User.class);

                 }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            };
            mDatabaseReference.child(userId).addListenerForSingleValueEvent(userValueEventListener);
        }

your user Pojo should be like below.

public class User {
    String email,name,phoneNum,uid;

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPhoneNum() {
        return phoneNum;
    }

    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }

    public String getUid() {
        return uid;
    }

    public void setUid(String uid) {
        this.uid = uid;
    }
}

Upvotes: 0

Rishabh Mahatha
Rishabh Mahatha

Reputation: 1271

final Query query = mFirebaseDatabase.orderByChild("phoneNum").equalTo("userPhoneNumber");
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    //here means the value exist
                    //do whatever you want to do
                } else {
                    //here means the value not exist
                    //do whatever you want to do
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
            }
        });

Use this to check whether the data exist or not.

Upvotes: 2

Related Questions