Firebase实时数据库仅首次读取有效?后续无响应如何修复?
修复Firebase Realtime Database后续读取无响应的问题
核心问题:数据库引用路径错误
你当前的getReference参数包含了冗余的数据库标识信息(DATABASE_NAME/europe-west1/firebasedatabase/app/),这是错误的。Firebase会通过google-services.json自动配置数据库的根路径,无需手动拼接这些后缀。错误的路径会导致后续读取指向不存在的节点,因此onDataChange无法触发或返回null。
修正后的数据库引用代码
// 直接获取根节点引用,无需额外路径前缀 DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); mDatabase.child("users").child(mAuth.getCurrentUser().getUid()).addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { // 先判断节点是否存在 loggedUser = snapshot.getValue(User.class); // 这里处理获取到的用户数据,比如更新UI } else { Log.w("onDataChange", "用户节点不存在"); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("onDataChange Error", error.getMessage()); } });
其他排查与优化步骤
确保Auth状态有效:在读取数据前,确认
mAuth.getCurrentUser()不为null。可以添加Auth状态监听,避免页面重启时用户状态未同步:mAuth.addAuthStateListener(new FirebaseAuth.AuthStateListener() { @Override public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { FirebaseUser user = firebaseAuth.getCurrentUser(); if (user != null) { // 用户已登录,执行数据读取逻辑 loadUserData(user.getUid()); } else { // 用户未登录,跳转登录页面 } } });把数据读取逻辑封装到
loadUserData(String uid)方法中,在Auth状态确认后调用。管理监听生命周期:在Activity的
onStart方法中添加监听,onStop方法中移除监听,避免内存泄漏并确保每次进入页面都能重新同步数据:private ValueEventListener userDataListener; @Override protected void onStart() { super.onStart(); FirebaseUser user = mAuth.getCurrentUser(); if (user != null) { userDataListener = new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()) { loggedUser = snapshot.getValue(User.class); // 处理数据 } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e("onDataChange Error", error.getMessage()); } }; mDatabase.child("users").child(user.getUid()).addValueEventListener(userDataListener); } } @Override protected void onStop() { super.onStop(); if (userDataListener != null && mAuth.getCurrentUser() != null) { mDatabase.child("users").child(mAuth.getCurrentUser().getUid()).removeEventListener(userDataListener); } }强制同步数据:如果是离线缓存导致的不同步,可以开启节点的实时同步:
mDatabase.child("users").child(mAuth.getCurrentUser().getUid()).keepSynced(true);这会强制Firebase与服务器同步该节点的数据,避免依赖本地缓存。
检查数据库规则:确认你的Realtime Database规则允许已登录用户读取自身数据,比如:
{ "rules": { "users": { "$uid": { ".read": "$uid === auth.uid", ".write": "$uid === auth.uid" } } } }
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

