enter image description here在我的应用程序中,我允许用户将他们的详细信息保存到firebase数据库中 然后我试图让用户在ListView中查看他们的详细信息。
package com.example.aaron.inthehole;
import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
public class view_database extends AppCompatActivity {
private static final String TAG = "ViewDatabase";
//add Firebase Database stuff
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_database);
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();
assert user != null;
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());
} 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()){
UserInformation uInfo = new UserInformation();
uInfo.setName(ds.child(userID).getValue(UserInformation.class).getName()); //set the name
uInfo.setHandicap(ds.child(userID).getValue(UserInformation.class).getHandicap()); //set the name
uInfo.setAge(ds.child(userID).getValue(UserInformation.class).getAge()); //set the email
uInfo.setGender(ds.child(userID).getValue(UserInformation.class).getGender()); //set the phone_num
//display all the information
Log.d(TAG, "showData: name: " + uInfo.getName());
Log.d(TAG, "showData: age: " + uInfo.getAge());
Log.d(TAG, "showData: handicap: " + uInfo.getHandicap());
Log.d(TAG, "showData: gender: " + uInfo.getGender());
ArrayList<String> array = new ArrayList<>();
array.add("Full Name:");
array.add(uInfo.getName());
array.add("Age:");
array.add(uInfo.getAge());
array.add("Handicap:");
array.add(uInfo.getHandicap());
array.add("Gender:");
array.add(uInfo.getGender());
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
mListView.setAdapter(adapter);
}
}
*/
private void showData(DataSnapshot dataSnapshot) {
ArrayList<String> array = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()){
UserInformation uInfo = ds.getValue(UserInformation.class);
array.add(uInfo.getName() + " / " + uInfo.getAge());
}
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);
}
}
/**
* customizable toast
* @param message
*/
private void toastMessage(String message){
Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
}
}
公共类UserInformation {
private String name;
private String age;
private String gender;
private String handicap;
public UserInformation(){
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getHandicap() {
return handicap;
}
public void setHandicap(String handicap) {
this.handicap = handicap;
}
} 当我运行我的应用程序并进入视图详细信息页面时,会发生错误,并且在运行中会出现一条消息:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.aaron.inthehole, PID: 8958
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.aaron.inthehole.UserInformation.getName()' on a null object reference
at com.example.aaron.inthehole.view_database.showData(view_database.java:94)
at com.example.aaron.inthehole.view_database.access$100(view_database.java:31)
at com.example.aaron.inthehole.view_database$2.onDataChange(view_database.java:80)
at com.google.android.gms.internal.zzegf.zza(Unknown Source:13)
at com.google.android.gms.internal.zzeia.zzbyc(Unknown Source:2)
at com.google.android.gms.internal.zzeig.run(Unknown Source:65)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
这是我的应用程序中存储详细信息的部分
String name1 = name.getText().toString();
String handicap1 = handicap.getText().toString();
String age1 = age.getText().toString();
String gender1 = gender.getText().toString();
String user_id = mAuth.getCurrentUser().getUid();
DatabaseReference current_user_db = FirebaseDatabase.getInstance().getReference().child("Users").child(user_id);
Map newPost = new HashMap();
newPost.put("name",name1);
newPost.put("handicap",handicap1);
newPost.put("age",age1);
newPost.put("gender",gender1);
current_user_db.setValue(newPost);
Toast.makeText(ProfileActivity.this, "Details Saved", Toast.LENGTH_SHORT).show();
答案 0 :(得分:0)
只需添加if(dataSnapshot.exists())
if(dataSnapshot.exists())
{
UserInformation uInfo = new UserInformation();
uInfo.setName(ds.child(userID).getValue(UserInformation.class).getName()); //set the name
uInfo.setHandicap(ds.child(userID).getValue(UserInformation.class).getHandicap()); //set the name
uInfo.setAge(ds.child(userID).getValue(UserInformation.class).getAge()); //set the email
uInfo.setGender(ds.child(userID).getValue(UserInformation.class).getGender()); //set the phone_num
}
答案 1 :(得分:0)
根据您编辑的帖子,要解决此问题,请进行以下更改。首先更改以下代码行:
myRef = mFirebaseDatabase.getReference();
与
myRef = mFirebaseDatabase.getReference().child("Users");
您的代码只能减少到几行代码:
private void showData(DataSnapshot dataSnapshot) {
ArrayList<String> array = new ArrayList<>();
for(DataSnapshot ds : dataSnapshot.getChildren()){
UserInformation uInfo = ds.getValue(UserInformation.class);
array.add(uInfo.getName() + " / " + uInfo.getAge());
}
ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
mListView.setAdapter(adapter);
}
您的代码中存在两个主要问题。您正在创建UserInformation
类的新实例,而不是从数据库中获取一个实例。第二,您正在创建一个新列表,并且您正在每次迭代时设置适配器。正如您所看到的,我已将这些代码行移到该循环之外。
对于当前经过身份验证的用户,请更改以下行:
myRef = mFirebaseDatabase.getReference().child("Users");
使用:
myRef = mFirebaseDatabase.getReference().child("Users").child(userID);