我尝试使用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,它是在检查signInWithEmailAndPassword.addOnCompleteListener是否成功后由firebaseAuth.getCurrentUser返回的。
,在addListenerForSingleValueEvent之后,我添加了一个Logt,其编写如下:
Log.d(TAG, "Value of variable: " + currentUserUsername);
我希望currentUserUsername在分配的数据库中具有“ username”的值,但我得到:
LoginActivity:变量的值:null
Edit2:在调试时,我意识到当调试器到达.addListenerForSingleValueEvent并按F8时,它将完全跳过此方法。因此,正如有人在评论中说的那样,datasnapshot可能不为null,因此从未访问过。但是我仍然不明白为什么。
答案 0 :(得分:1)
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);
}