-1

Logcat Output:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String firebase.firebasepractice.User.getUsername()' on a null object reference. ...

User:

User class

MainActivity:

public class MainActivity extends AppCompatActivity {

  private EditText name,password;
  Button btn;
  TextView tv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    name = (EditText) findViewById(R.id.userName);
    password= (EditText) findViewById(R.id.password);
    btn= (Button) findViewById(R.id.submit);
    tv= (TextView) findViewById(R.id.tv);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            DatabaseReference myRef=FirebaseDatabase.getInstance().getReference("Users");

                String userId=myRef.push().getKey();

            myRef.child(userId).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    User user=dataSnapshot.getValue(User.class);
                    tv.setText("Name is "+user.getUsername()+"    Email is "+user.getEmail());
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    });
}
}
BhalchandraSW
  • 714
  • 5
  • 13

2 Answers2

0

Because mapping between datasnapshot and User model is failed.

User user=dataSnapshot.getValue(User.class);
// check it null there
if(user != null) {
 tv.setText("Name is "+user.getUsername()+"    Email is "+user.getEmail());
}
Rahul
  • 10,457
  • 4
  • 35
  • 55
0

You are missing a no-args constructor in User class:

Please add:

public User() {
}

Then, you are initialising myRef like this:

myRef=FirebaseDatabase.getInstance().getReference("Users");

And then again accessing 'Users' node under 'Users'

myRef.child("Users")

Lastly, I believe you are passing a wrong variable to a .child() call in:

myRef.child("Users")
    .addValueEventListener ...

You should be doing:

myRef.child(userId) // this line is changed
    .addValueEventListener ...

Your final code should look like:

DatabaseReference myRef = FirebaseDatabase.getInstance().getReference("Users");

String userId = myRef.push().getKey();

myRef.child(userId) // Change: "Users" -> userId
    .addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            tv.setText("Name is " + user.getUsername() + "\tEmail is " + user.getEmail());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
BhalchandraSW
  • 714
  • 5
  • 13