Android Studio中如何获取经if-else分支修改后的Firebase引用变量新值
问题根因
- 变量作用域问题:你在
onDataChange的else块中用final DatabaseReference uidRef重新声明了一个局部同名变量,仅在else块内有效,完全不会修改外层定义的uidRef变量。 - 监听器绑定逻辑问题:你最开始已经将监听器绑定到了
Driver节点的引用上,即使后续修改了外层uidRef的指向,已经触发的监听器返回的snapshot仍然是Driver节点的查询结果,你直接拿这个不存在的snapshot去解析User类必然拿不到值,也不会自动去请求Customer节点的数据。
解决方案
如果你的需求是先查Driver节点,不存在就查Customer节点,拿到对应用户的邮箱,直接在else块中主动查询Customer节点即可,修改后代码如下:
auth=FirebaseAuth.getInstance(); uid = auth.getCurrentUser().getUid(); button=findViewById(R.id.button2); Fixmail = findViewById(R.id.fixedemail); password=findViewById(R.id.editTextTextPassword); reference = FirebaseDatabase.getInstance().getReference("Users"); // 先查Driver节点 DatabaseReference driverRef = reference.child("Driver").child(uid); ValueEventListener driverListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { Users usersnapshot = snapshot.getValue(Users.class); if (usersnapshot != null) { String Email = usersnapshot.getMail(); Fixmail.setText(Email); } } else { // Driver节点不存在,主动查Customer节点 reference.child("Customer").child(uid).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot customerSnapshot) { if (customerSnapshot.exists()) { Users usersnapshot = customerSnapshot.getValue(Users.class); if (usersnapshot != null) { String Email = usersnapshot.getMail(); Fixmail.setText(Email); } } } @Override public void onCancelled(@NonNull DatabaseError error) { // 按需处理异常 } }); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 按需处理异常 } }; driverRef.addListenerForSingleValueEvent(driverListener);
如果你后续需要全局使用正确的节点引用,可以将外层的uidRef定义为类成员变量,不要在局部重新声明,在拿到正确节点的时候给成员变量赋值即可。
内容的提问来源于stack exchange,提问作者Mohammad Yusuf
相关产品推荐
相关产品推荐

