我正在尝试从数据库中获取特定用户,但我不能,也想检查是否已经有一个具有相同名称(uid)的节点。我不想获取整个用户列表,然后从中检索一个用户列表,因为我认为这对性能没有好处,我的想法是直接从数据库中获取用户
我尝试了很多方法,但是我尝试的所有方法都返回null,我无法从dataSnapshot获取值。我使用接口来确保读取完成后执行代码
.btproj
在这里界面
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) {
}
});
}
当我尝试获取用户时,它显示NullPointerException
public interface DataStatus{
void dataIsLoaded(User user);
}
用户创建,当我调用此方法时,我会 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) {
}
});
}
Here's how my data base is organized
已解决
问题是一段代码,我试图在{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
}
}
}
界面方法之外访问用户,并且由于dataIsLoaded
是异步的,所以该用户不是尚未下载,因此与代码冲突。
答案 0 :(得分:0)
欢迎来到SO社区
请使用.child()
方法,而不是级联带有“ /”的节点,如下所示
另外,使用.exists()
方法检查datasnapshot的值是否不为空
currentUser = FirebaseAuth.getInstance().getCurrentUser();
mUserReference = FirebaseDatabase.getInstance().getReference.child("users").child(currentUser.getUid());
mUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
user = dataSnapshot.getValue(User.class);
dataStatus.dataIsLoaded(user);
}
}
// rest of code
如果需要进一步的支持,请随时
更新
请在下面替换您的听众
currentUser = FirebaseAuth.getInstance().getCurrentUser();
mUserReference = FirebaseDatabase.getInstance().getReference.child("users").child(currentUser.getUid());
Query query = FirebaseDatabase.getInstance().getReference.child("users").orderByKey()
.equalTo(currentUser.getUid());
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) { // dataSnapshot contains set of returned result of the query
User user = singleSnapshot.getValue(User.class);
if (user != null) {
dataStatus.dataIsLoaded(user);
}
}
}
}
答案 1 :(得分:0)
欢迎来到SO社区。
您何时调用函数来读取用户内容?
这可能是异步问题。
为确保这一点,请在用户作为参数的地方创建一个函数,并在您从数据库中读取某些内容后对其进行调用(onDataChange)。
另外,您在阅读时是否尝试打印出“用户”内部的内容?如果它为您提供null,则问题肯定在路径之内。如果是这样,请使用.child(“ users”)。child(currentUser.getUid())