为什么当我从Firebase获取数据时它返回NULL?

时间:2016-09-14 15:22:42

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

我试图通过电子邮件搜索从firebase检索用户的数据来查找用户ID并使用该ID来获取用户的节点子节点,因此我使用该代码来执行该操作:

    mSignin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            mEmailStr = SignupActivityFragment.removeSpaces(mEmail.getText().toString());
            mPasswordStr = mPassword.getText().toString();

            mAuth.signInWithEmailAndPassword(mEmailStr, mPasswordStr).addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(Task<AuthResult> task) {
                    if (task.isSuccessful()){
                        getExistingUserInfo();
                        if(User!=null) {
                            sglstr = User.get("sgl");
                            if (sglstr.equals("true")) {
                                Intent intent = new Intent(getActivity(), ControllerSGL.class);
                                intent.putExtra("user", User);
                                startActivity(intent);
                            } else if (sglstr.equals("false")) {
                                Intent intent = new Intent(getActivity(), ControllerStudent.class);
                                intent.putExtra("user", User);
                                startActivity(intent);
                            }

                        }
                        else {
                            Toast.makeText(getActivity(), "NULL!!!!!!", Toast.LENGTH_SHORT).show();
                        }
                        Toast.makeText(getActivity(), "Success", Toast.LENGTH_SHORT).show();

                    }else {
                        Toast.makeText(getActivity(), "Not Success", Toast.LENGTH_SHORT).show();
                    }

                }
            });

        }
    });

getExistingUserInfo方法

public void getExistingUserInfo(){

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    database.getReference().child("allUsers").orderByChild("emailAddress")
            .equalTo(mEmailStr)
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                        uid = childSnapshot.getKey();
                        Log.v("HimaAbosalem",uid);

                    }
                }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    database.getReference("allUsers").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //get user data from dataSnapshot
            User=(HashMap<String,String>)dataSnapshot.getValue();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我需要使用HashMap发送数据抛出意图,但我在java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()方法的这一部分给了我getExistingUserInfo

  database.getReference("allUsers").child(uid).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            //get user data from dataSnapshot
            User=(HashMap<String,String>)dataSnapshot.getValue();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我认为问题是uid值等于null但是我做了一个日志并且它没有,我试图发送该uid向另一个活动发出意图并且我收到它发现它不是null但是当我试图获取该新Activity中的数据时,它会给出相同的错误!

1 个答案:

答案 0 :(得分:1)

我通过将getExistingUserInfo划分为两个单独的函数来解决此问题,并在allUsers调用获取onDataChange的函数以保证用户的ID返回 编辑后的代码:

public void getExistingUserInfo(){

FirebaseDatabase database = FirebaseDatabase.getInstance();
database.getReference().child("allUsers").orderByChild("emailAddress")
        .equalTo(mEmailStr)
        .addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot childSnapshot : dataSnapshot.getChildren()) {
                    uid = childSnapshot.getKey();
                    Log.v("HimaAbosalem",uid);

                }
                getUser(uid);
            }
    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
} 
 public void getUser(String uid){
  database.getReference("allUsers").child(uid).addListenerForSingleValueEvent(new  ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        //get user data from dataSnapshot
        User=(HashMap<String,String>)dataSnapshot.getValue();
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});
}