You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firebase实时数据库数据无法保存:集成成功但无回调响应

Firebase Realtime Database setValue 无回调且数据未写入问题

我正在开发一个Android项目,已成功集成Firebase Realtime Database。为测试数据是否能保存到数据库,编写了如下代码:

information_ReadingBinding.testting.setOnClickListener {
    Toast.makeText(this, "Hello user", Toast.LENGTH_LONG).show()

    reference.child("Users").child("Welcome").setValue("Hello Firebase").addOnCompleteListener { task ->
        if (task.isSuccessful) {
            Log.d("Firebase", "Test data saved successfully.")
            Toast.makeText(applicationContext, "Testing successful..", Toast.LENGTH_SHORT).show()
        } else {
            Log.e("Firebase", "Failed to save test data: ${task.exception?.message}")
            Toast.makeText(applicationContext, "Failed to save data: ${task.exception?.message}", Toast.LENGTH_LONG).show()
        }
    }
}

点击按钮时,Toast消息"Hello user"正常显示,但数据未保存到数据库,且addOnCompleteListener的成功/失败回调均未触发。

已执行的操作

  • 按Firebase官方Android文档完成集成;
  • 确认google-services.json已正确添加;
  • 验证build.gradle包含Firebase依赖;
  • 确认Firebase控制台已启用Realtime Database;
  • 当前Firebase规则设置为:
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}
  • 调试确认点击前无错误日志。

环境信息

  • Android Studio Flamingo | 2022.2.1 Patch 2
  • Firebase Database SDK版本:20.0.6
  • Kotlin版本:1.8.10
  • 测试设备:Android 12

尝试过的解决步骤

  • 重新验证Firebase配置;
  • 确认google-services.json在app目录;
  • 检查build.gradle已添加依赖:
implementation 'com.google.firebase:firebase-database-ktx:20.0.6'
implementation 'com.google.firebase:firebase-auth-ktx:22.1.1'
  • 临时修改数据库规则为全开放以测试;
  • 加日志验证setValue()被调用;
  • 清理重建项目、卸载重装应用。

预期结果:点击按钮时数据写入Users/Welcome路径,成功或失败均有对应提示。请问为何setValue无法保存数据?我遗漏了什么?


问题排查与解决方案

1. 检查reference实例是否正确初始化

代码中的reference对象大概率没正确获取Firebase Realtime Database实例。确保初始化代码如下:

// 标准初始化方式
val reference = Firebase.database.reference
// 若数据库使用非默认区域,需指定URL
// val reference = Firebase.database("https://你的数据库地址.firebaseio.com").reference

如果reference是未初始化的空对象或错误实例,setValue()调用会静默失败,不会触发任何回调。

2. 补全身份认证逻辑

当前数据库规则要求读写必须登录,但你的代码里没有任何认证操作。哪怕临时开放规则,若设备缓存了旧的未登录状态,也可能导致请求被拦截。建议先添加匿名登录测试:

// 可在Activity初始化或按钮点击事件前执行
Firebase.auth.signInAnonymously()
    .addOnCompleteListener { authTask ->
        if (authTask.isSuccessful) {
            Log.d("FirebaseAuth", "匿名登录成功")
            // 登录成功后再执行数据库写入操作
        } else {
            Log.e("FirebaseAuth", "匿名登录失败: ${authTask.exception?.message}")
        }
    }

务必保证在认证成功后再调用setValue(),否则无权限请求会被Firebase拦截,旧版本SDK可能不会触发失败回调。

3. 检查Firebase连接状态

添加连接监听,确认设备与Firebase服务器的连接是否正常:

Firebase.database.reference.child(".info/connected").addValueEventListener(object : ValueEventListener {
    override fun onDataChange(snapshot: DataSnapshot) {
        val isConnected = snapshot.getValue(Boolean::class.java) ?: false
        Log.d("FirebaseConn", "当前连接状态: $isConnected")
    }

    override fun onCancelled(error: DatabaseError) {
        Log.e("FirebaseConn", "连接监听失败: ${error.message}")
    }
})

如果设备无法连接到Firebase,setValue()会进入本地重试队列,不会立即触发回调。

4. 升级Firebase Database SDK版本

你使用的20.0.6版本是较旧的稳定版,存在部分静默失败的已知问题。建议升级到更新的稳定版本(如20.3.0及以上),修改build.gradle中的依赖:

implementation 'com.google.firebase:firebase-database-ktx:20.3.0'

新版本修复了部分回调触发异常的场景,能更准确地返回错误日志。

5. 确认网络权限配置

检查AndroidManifest.xml中是否添加了必要的网络权限:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

没有网络权限会导致设备无法与Firebase服务器通信,请求直接静默失败。


内容的提问来源于stack exchange,提问作者Teli Vinayak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 21:42:48