[英]Why am I getting a Null Pointer Exception when reading user data from Firebase?
我目前正在創建一個Android應用程序,允許人們注冊和登錄帳戶,向他們的個人資料添加詳細信息,然后在另一個頁面上顯示這些詳細信息。
我已經成功地將用戶登錄到我的應用程序並存儲他們的配置文件數據,但是,我在ViewProfileActivity類的第90行得到了一個空指針異常。 它是: uInfo.setAddress(ds.child(userID).getValue(UserDetails.class).getAddress());
我已確保數據庫已啟用讀寫。 任何幫助將不勝感激。
下面是所有可能的相關代碼和firebase數據庫結構的圖像
ViewProfileActivity
public class ViewProfileActivity extends AppCompatActivity {
private static final String TAG = "ViewDatabase";
private FirebaseDatabase mFirebaseDatabase;
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private String userID;
private ListView mListView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_profile);
mListView = (ListView) findViewById(R.id.listview);
//declare the database reference object. This is what we use to access the database.
//NOTE: Unless you are signed in, this will not be useable.
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
myRef = mFirebaseDatabase.getReference();
FirebaseUser user = mAuth.getCurrentUser();
userID = user.getUid();
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
toastMessage("Successfully signed in with: " + user.getEmail());
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
toastMessage("Successfully signed out.");
}
// ...
}
};
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// This method is called once with the initial value and again
// whenever data at this location is updated.
showData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private void showData(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
UserDetails uInfo = new UserDetails();
uInfo.setAddress(ds.child(userID).getValue(UserDetails.class).getAddress()); //set the email
uInfo.setDateOfBirth(ds.child(userID).getValue(UserDetails.class).getDateOfBirth());
uInfo.setName(ds.child(userID).getValue(UserDetails.class).getName()); //set the name
uInfo.setPhoneNumber(ds.child(userID).getValue(UserDetails.class).getPhoneNumber());
//display all the information
Log.d(TAG, "showData: name: " + uInfo.getName());
Log.d(TAG, "showData: email: " + uInfo.getAddress());
Log.d(TAG, "showData: phone_num: " + uInfo.getPhoneNumber());
Log.d(TAG, "showData: phone_num: " + uInfo.getDateOfBirth());
ArrayList<String> array = new ArrayList<>();
array.add(uInfo.getName());
array.add(uInfo.getAddress());
array.add(uInfo.getPhoneNumber());
array.add(uInfo.getDateOfBirth());
ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, array);
mListView.setAdapter(adapter);
}
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
}
CreateProfileActivity
public class CreateProfileActivity extends AppCompatActivity {
private FirebaseAuth auth;
private TextView textViewUserEmail;
private EditText editTextName;
private EditText editTextPhoneNumber;
private EditText editTextPostalAddress;
private EditText editTextDateOfBirth;
private Button buttonSaveProfile;
private Button buttonLogout;
private DatabaseReference databaseReference;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_profile);
auth = FirebaseAuth.getInstance();
if(auth.getCurrentUser() == null)
{
finish();
startActivity(new Intent(this,LoginActivity.class));
}
databaseReference = FirebaseDatabase.getInstance().getReference();
FirebaseUser user = auth.getCurrentUser();
textViewUserEmail = (TextView) findViewById(R.id.textViewUserEmail);
textViewUserEmail.setText("Welcome " + user.getEmail());
buttonLogout = (Button) findViewById(R.id.buttonLogout);
buttonSaveProfile = (Button) findViewById(R.id.buttonSaveProfile);
editTextName = (EditText) findViewById(R.id.editTextName);
editTextPhoneNumber = (EditText) findViewById(R.id.editTextPhoneNumber);
editTextPostalAddress = (EditText) findViewById(R.id.editTextPostalAddress);
editTextDateOfBirth = (EditText) findViewById(R.id.editTextDateOfBirth);
buttonLogout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
auth.signOut();
finish();
startActivity(new Intent(CreateProfileActivity.this, LoginActivity.class));
}
});
buttonSaveProfile.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveUserInformation();
}
});
}
private void saveUserInformation()
{
String address = editTextPostalAddress.getText().toString().trim();
String dateOfBirth = editTextDateOfBirth.getText().toString().trim();
String name = editTextName.getText().toString().trim();
String phoneNumber = editTextPhoneNumber.getText().toString().trim();
UserInformation userInformation = new UserInformation(name, address, dateOfBirth, phoneNumber);
FirebaseUser user = auth.getCurrentUser();
databaseReference.child("users").child(user.getUid()).setValue(userInformation);
Toast.makeText(this, "Information Saved...", Toast.LENGTH_SHORT).show();
startActivity(new Intent(CreateProfileActivity.this, ViewProfileActivity.class));
}
}
UserDetails類
public class UserDetails
{
public String name;
public String address;
public String dateOfBirth;
public String phoneNumber;
public UserDetails()
{
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getDateOfBirth() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth = dateOfBirth;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
}
我想你不是指你想要的數據
而不是這個
myRef = mFirebaseDatabase.getReference();
用它來指向你的數據
myRef = mFirebaseDatabase.getReference().child("users");
改變這一行
myRef.addValueEventListener(new ValueEventListener()...
有了這個
myRef.child("users").addValueEventListener(new ValueEventListener()...
也可以在你的UserDetails.class
按下其中一個變量Fn + alt + insert
,選擇Constructor
並選擇所有變量並為它們創建一個構造函數,並且不要刪除空的那個也將它保留在那里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.