【发布时间】:2020-08-05 18:20:53
【问题描述】:
我尝试使用 Firebase 实时数据库进行登录活动。
注册时我的数据库如下图所示:
登录时,我想初始化一个公共静态用户,以便我可以在我的主要活动中检索它并相应地更新 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.getCurrentUser 在检查 signInWithEmailAndPassword.addOnCompleteListener 是否成功后返回的 FirebaseUser。
在 addListenerForSingleValueEvent 之后,我添加了一个 Log.d,其编写如下:
Log.d(TAG, "Value of variable: " + currentUserUsername);
我希望 currentUserUsername 在分配的数据库中具有“用户名”的值,但相反,我得到:
LoginActivity:变量值:null
Edit2:在调试时,我意识到当调试器到达 .addListenerForSingleValueEvent 并按 F8 时,它完全跳过了这个方法。因此,正如评论中有人所说,数据快照可能不为空,它从未被访问过。但我还是不明白为什么。
【问题讨论】:
-
请编辑您的问题以包含您如何初始化
currentUserReference的代码。 -
另请注意:传递给
onDataChange的dataSnapshot将永远为空。究竟是什么行不通。通常最容易看出您是否包含 som` Log.d()` 语句,这些语句不会产生您期望的输出。 -
这样试试 `currentUserUsername = (String) dataSnapshot.child("username").getValue();`
-
@Black4Guy 不幸的是,它不起作用。我编辑了更多可能有帮助的信息。既然 Frank 告诉我 datasnapshot 不可能返回 null 并且我确认这实际上不是我的调试问题,我是否应该编辑标题?
标签: java android firebase-realtime-database firebase-authentication