如何使用Firebase Realtime Database存储Int类型按钮点击计数
问题根因说明
你当前的问题不是Firebase Realtime Database不支持Int类型存储,而是现有逻辑存在两处缺陷:
- 本地计数变量
incrementNumber未和云端数据同步,每次打开应用都会重置为0,也无法同步其他设备的更新记录 - 你定义的
Total数据类完全没有参与存取逻辑,不符合Firebase对象序列化存取规范
修复方案
1. 保留原有数据类(无需修改)
data class Total(val amount: Int? = null)
2. 修正Activity逻辑,实现云端数据同步
class SecondActivity : AppCompatActivity() { // 声明数据库引用 private val database = FirebaseDatabase.getInstance().getReference("Total") // 本地存储当前计数值,和云端同步更新 private var currentCount = 0 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_second) // 监听云端数值变化,同步更新本地变量和UI database.child("value").addValueEventListener(object : ValueEventListener { override fun onDataChange(snapshot: DataSnapshot) { // 直接读取Int类型值,云端无数据时默认返回0 currentCount = snapshot.getValue(Int::class.java) ?: 0 increment_textview.text = "Button has been pressed $currentCount times!" } override fun onCancelled(error: DatabaseError) { // 自行添加读取错误的兜底处理 } }) button_increment.setOnClickListener { currentCount += 1 // 直接存入Int类型值即可,Firebase会自动识别为number类型存储 database.child("value").setValue(currentCount) // 如果要使用自定义数据类存储,使用下方代码即可,效果完全一致: // database.setValue(Total(currentCount)) } } }
验证注意事项
测试阶段可以临时把Firebase Realtime Database的读写权限放开,避免权限拦截导致写入失败:
{ "rules": { ".read": true, ".write": true } }
内容的提问来源于stack exchange,提问作者John Doe
相关产品推荐
相关产品推荐

