【发布时间】:2019-10-02 00:13:01
【问题描述】:
我正在尝试从数据库中获取特定用户,但我不能,我还想检查是否已经有一个具有相同名称(uid)的节点。我不想获取整个用户列表然后从中检索一个,因为我认为这对性能没有好处,我的想法是直接从数据库中获取用户
我尝试了很多方法,但我尝试的所有方法都返回 null,我无法从 dataSnapshot 中获取值。我使用接口来确保在读取完成后执行代码
currentUser = FirebaseAuth.getInstance().getCurrentUser();
mUserReference = FirebaseDatabase.getInstance().getReference("users/"+currentUser.getUid());
mUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user = dataSnapshot.getValue(User.class);
dataStatus.dataIsLoaded(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
界面在这里
public interface DataStatus{
void dataIsLoaded(User user);
}
当我尝试获取用户时,它显示 NullPointerException
UserUtils userUtils = new UserUtils();
userUtils.getUser(new UserUtils.DataStatus() {
@Override
public void dataIsLoaded(User user) {
mUser = user;
}
});
用户创建,当我调用这个方法时我会做uid = currentUser.getUid()
public void createNewUser(String uid, String name, String email, DataStatus dataStatus) {
mUserReference = mDatabase.child("users").child(uid);
mUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
user = new User(name, email);
mDatabase.child("users").child(uid).setValue(user);
dataStatus.dataIsLoaded(user);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
这里是规则
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
Here's how my data base is organized
已解决
问题是一段代码,我没有在这里包含它,它试图在dataIsLoaded 接口方法之外访问用户,并且由于onDataChange 是异步的,用户还没有被下载所以它与代码冲突。
【问题讨论】:
-
你能显示创建用户的代码吗
-
是的,我刚刚添加了它
-
我的意思是在 firebase 中创建用户。
-
你能把创建用户的代码放到firebase里吗?
-
是的,抱歉,已经完成了
标签: java android firebase firebase-realtime-database