为什么当我从Firebase获取数据时,它返回NULL?
问题描述:
我试图从使用电子邮件搜索来查找用户ID并使用该ID来获得用户的子节点火力检索用户的数据,所以我使用的代码来做到这一点:为什么当我从Firebase获取数据时,它返回NULL?
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值等于空,但我做了一个日志,它不是,我试图发送该uid向另一个活动投掷意图,我收到它发现它不是空的,但当我试图获得在新的活动中的数据,它给出了相同的错误!
答
我解决了这个问题,通过鸿沟getExistingUserInfo
两个独立的功能,并呼吁,在onDataChange
得到allUsers
功能,保证用户的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) {
}
});
}
http://ideone.com/PPHi95 ...明显'getExistingUserInfo'什么都不做,只是调用异步方法,不要等到它们完成... – Selvin
看到这个问题的答案类似的问题:http://*.com/a/39472821/4815718 –
如何做到这一点“处理这种行为的方法是将程序的流程从”首先获取朋友列表中重新组织“,然后一起做xyz“到”每当朋友列表发生变化时,用xyz做它“。”在我的案例中,我已经有了用户,我想要检索它的数据! –