Firebase addListenerForSingleValueEvent数据快照返回null

时间:2020-04-22 16:21:37

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

我尝试使用Firebase实时数据库进行登录活动。

注册时,我的数据库已显示如下:

screenshot of the database structure

登录后,我想初始化一个公共静态用户,以便可以在主活动中检索它并相应地更新UI,但ValueEventListener的dataSnapshop返回null。

这是我的addListenerForSingleValueEvent的代码:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

        currentUserUsername = dataSnapshot.child("/username").getValue(String.class);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        currentUserUsername = "ERROR";
    }

});

// Get every information into a User class
MainActivity.CURRENT_USER_SESSION = new User(
        currentUserUsername,
        user.getEmail(),
        user.getUid()
);

任何人都有帮助我的想法。还是有任何变通办法或建议可以做得更好?

编辑:以下是currenUserReference的初始化

currentUserReference = database.getReference("users/" + user.getUid());

像这样在onCreate中初始化数据库

database = FirebaseDatabase.getInstance();

我从中获取Uid的“用户”是firebaseAuth,它是在检查signInWithEmailAndPassword.addOnCompleteListener是否成功后由firebaseAuth.getCurrentUser返回的。

,在addListenerForSingleValueEvent之后,我添加了一个Logt,其编写如下:

Log.d(TAG, "Value of variable: " + currentUserUsername);

我希望currentUserUsername在分配的数据库中具有“ username”的值,但我得到:

LoginActivity:变量的值:null

Edit2:在调试时,我意识到当调试器到达.addListenerForSingleValueEvent并按F8时,它将完全跳过此方法。因此,正如有人在评论中说的那样,datasnapshot可能不为null,因此从未访问过。但是我仍然不明白为什么。

1 个答案:

答案 0 :(得分:1)

当您退出onDataChange时,

dataSnapshot.getValue(String.class)不返回null 您的currentUserUsername将重新初始化。

因此,要将值传递给下一个活动,您需要:

currentUserReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            currentUserUsername = dataSnapshot.getValue(String.class);
            // Get every information into a User class
            MainActivity.CURRENT_USER_SESSION = new User(
                    currentUserUsername,
                    user.getEmail(),
                    user.getUid()
            );
            Intent intent = new Intent(
                    LoginActivity.this, MainActivity.class);
            startActivity(intent);
        }