无法读取Firebase数据库,数据返回null

时间:2019-10-02 00:13:01

标签: java android firebase firebase-realtime-database

我正在尝试从数据库中获取特定用户,但我不能,也想检查是否已经有一个具有相同名称(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是异步的,所以该用户不是尚未下载,因此与代码冲突。

2 个答案:

答案 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())