从实时数据库检索数据时出现Android错误

时间:2018-03-18 12:32:07

标签: android firebase firebase-realtime-database firebase-authentication

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();

2 个答案:

答案 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);