我知道过去曾有人问过这个问题。我尝试了几乎所有的解决方案都不适合我。抱歉再次询问。但是有人可以帮我解决此错误。
这是我的代码。
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)
答案 0 :(得分:2)
您需要更改
DatabaseReference databaseReference = firebaseDatabase.getReference().child(firebaseUser.getUid());
收件人
DatabaseReference databaseReference = firebaseDatabase.getReference().child("Accounts").child(firebaseUser.getUid());
您指向错误的节点。不包含必需的数据。
注意:
您无需将push_id
存储为id
。
您可以简单地获取它而无需将其存储在内部。
String userIDstr = dataSnapshot.getKey();
答案 1 :(得分:2)
您需要更改
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);
答案 2 :(得分:2)
您在使用什么:
.child(firebaseUser.getUid())
这意味着您要将来自Firebase身份验证过程的用户ID传递给子方法。但是,传递此ID并没有帮助,因为在您的数据库中,我看到您拥有一个push()
方法生成的ID,而不是来自FirebaseUser
对象的ID。
为解决此问题,您可以将正确的ID传递给child()
到-LS3X ... 6Meg
方法,或者通过删除{{1}来更改将用户添加到数据库的方式。 }调用并使用类似这样的内容:
push()
第二种解决方案是推荐的解决方案。另外,请不要忘记从参考中添加现在丢失的String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.child("Accounts").child(uid).setValue(userObject);
个额外的孩子。