ошибка со строкой исключения Nullpointer в datasnapshot - PullRequest
0 голосов
/ 24 ноября 2018

Я знаю, что этот вопрос задавался в прошлом.Я испробовал почти все их решения, не работал для меня.Извините, что спросил это снова.Но может кто-нибудь помочь мне исправить эту ошибку.

Вот мой код.

public class ProfileActivity extends AppCompatActivity {

TextView userEmail;
TextView userID;
TextView userGender;
TextView userName;
Button userLogout;

FirebaseAuth firebaseAuth;
FirebaseUser firebaseUser;

FirebaseDatabase firebaseDatabase;

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

    userEmail = findViewById(R.id.tvUserEmail);
    userGender = findViewById(R.id.tvGender);
    userName = findViewById(R.id.tvName);
    userID = findViewById(R.id.tvUserID);
    userLogout = findViewById(R.id.btnLogout);

    firebaseAuth = FirebaseAuth.getInstance();
    firebaseUser = firebaseAuth.getCurrentUser();


    firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());

    //userEmail.setText(firebaseUser.getEmail());

    databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

            String userEmailstr = dataSnapshot.child("email").getValue().toString();
            String userNamestr = dataSnapshot.child("name").getValue().toString();
            String userGenderstr = dataSnapshot.child("gender").getValue().toString();
            String userIDstr = dataSnapshot.child("id").getValue().toString();


            userEmail.setText(userEmailstr);
            userGender.setText(userGenderstr);
            userName.setText(userNamestr);
            userID.setText(userIDstr);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Toast.makeText(getApplicationContext(),databaseError.getMessage(),Toast.LENGTH_SHORT).show();
        }
    });



    userLogout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            FirebaseAuth.getInstance().signOut();
            Intent intent = new Intent(ProfileActivity.this, MainActivity.class);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
            startActivity(intent);
        }
    });
}}

Ошибка в строках Datasnapshot.где сказано, что это нулевая ссылка на объект

Вот logcat

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
    at com.example.patrick.test.ProfileActivity$1.onDataChange(ProfileActivity.java:60)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.5:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.5:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.5:55)

Вот моя база данных enter image description here

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вам нужно изменить

DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid())

На

DatabaseReference databaseReference = firebaseDatabase.getReference().child("Accounts").child(firebaseUser.getUid());

И вместо

String userEmailstr = dataSnapshot.child("email").getValue().toString();

Использовать

String userEmailstr = dataSnapshot.child("email").getValue(String.class);
0 голосов
/ 24 ноября 2018

Когда вы используете:

.child(firebaseUser.getUid())

Это означает, что вы передаете дочернему методу идентификатор пользователя, который приходит из процесса аутентификации Firebase.Но передача этого идентификатора не поможет, так как в вашей базе данных я вижу, что у вас есть идентификатор, который генерируется методом push(), а не идентификатор из объекта FirebaseUser.

* 1009Чтобы решить эту проблему, вы либо передаете методу child() правильный идентификатор, равный -LS3X ... 6Meg, либо изменяете способ добавления пользователя в базу данных, удаляя вызов push(), и используете что-то вроде этого:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Accounts").child(uid).setValue(userObject);

Второе решение является рекомендуемым.Пожалуйста, не забудьте добавить Accounts дополнительного ребенка, которого сейчас нет, из вашей ссылки.

0 голосов
/ 24 ноября 2018

Вам нужно изменить

DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());

на

DatabaseReference databaseReference = firebaseDatabase.getReference().child("Accounts").child(firebaseUser.getUid());

Вы указываете на неправильный узел.это не содержит необходимые данные.

Примечание:

Вам не нужно хранить push_id внутри как id.

Вы можете просто получить его, не сохраняя еговнутри.

String userIDstr = dataSnapshot.getKey();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...