java - 为什么从 Firebase 读取用户数据时会出现空指针异常?

标签 java android firebase firebase-realtime-database nullpointerexception

我目前正在创建一个 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;
    }
}

Firebase Database Structure Image

最佳答案

我猜你指的不是你想要的数据

而不是这个

  myRef = mFirebaseDatabase.getReference();

用它来指向你的数据

 myRef = mFirebaseDatabase.getReference().child("users");

关于java - 为什么从 Firebase 读取用户数据时会出现空指针异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48813524/

相关文章:

android - 使用 onBackPressed 仅从第一个 fragment 退出应用程序

java - 在 Firebase 监听器中设置 Singleton 属性值

node.js - 使用 Busboy 在 Node.js 中将 Multipart/form-data 转换为 JSON

AngularJS Firebase 数据库通过复选框更新字段

java - 为什么Java编译器在下面的代码中为LinkedList DescendingIterator给出 "error: cannot find symbol"?

java - 在 GUI 中删除 txt 文件中的数据

java - 如何解决@CucumberOptions 中格式选项的弃用问题?

java - boolean 值在 RecyclerView 中单击按钮时不起作用

android - EditText 软键盘总是在 View 寻呼机的 fragment 上打开

java - 当特定的 EditText 具有焦点时滚动整个页面?