Java Android如何读取数据库值初始化int变量避免重置为0
Android Firebase 胜/负场计数初始化修复方案
问题根因
变量在Activity创建时直接硬编码初始值为0,页面加载阶段没有主动拉取数据库存量数据覆盖初始值,导致每次进入页面计数都从0开始累加。
数据库存储结构参考:
修复步骤
- 调整变量声明逻辑,保留0作为兜底默认值,在页面创建的生命周期节点提前拉取数据库数据完成变量初始化
- 提前定义当前玩家对应的数据库节点引用,避免每次点击按钮重复获取引用
- (可选优化)使用Firebase服务端原子自增能力替代原有「先读再写」逻辑,避免多端并发操作时出现计数覆盖错误
可直接复用的代码实现
1. 变量声明(类成员变量位置)
// 计数变量,默认0兜底,数据库拉取成功后自动覆盖 private int win_int = 0; private int lose_int = 0; // 数据库相关引用提前定义 private DatabaseReference database; private DatabaseReference playerRef; private String playerName;
2. 初始化逻辑(放在Activity的onCreate方法中,setContentView之后、绑定按钮事件之前执行)
// 初始化当前玩家对应的数据库节点 playerRef = database.getReference().child("players").child(playerName); // 进入页面时拉取存量数据完成计数变量初始化 playerRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 胜场读取,节点不存在时默认取0 Integer winValue = dataSnapshot.child("wins").getValue(Integer.class); win_int = winValue != null ? winValue : 0; // 负场读取,节点不存在时默认取0 Integer loseValue = dataSnapshot.child("loses").getValue(Integer.class); lose_int = loseValue != null ? loseValue : 0; // 如果要避免数据未加载完成时用户点击导致计数异常,可以在这里把两个按钮设为可点击状态 } @Override public void onCancelled(DatabaseError databaseError) { Toast.makeText(DuelGame.this, "初始化数据失败", Toast.LENGTH_SHORT).show(); } });
3. 优化后的按钮点击逻辑
Button win = (Button)findViewById(R.id.Poke); win.setOnClickListener(v -> { // 服务端原子自增1,无需依赖本地变量值,避免并发计数错误 playerRef.child("wins").setValue(ServerValue.increment(1)) .addOnSuccessListener(unused -> { win_int++; Toast.makeText(DuelGame.this, "+1 win!", Toast.LENGTH_SHORT).show(); }) .addOnFailureListener(e -> { Toast.makeText(DuelGame.this, "Data error!", Toast.LENGTH_SHORT).show(); }); }); Button lose = (Button)findViewById(R.id.lose_POKE); lose.setOnClickListener(v -> { playerRef.child("loses").setValue(ServerValue.increment(1)) .addOnSuccessListener(unused -> { lose_int++; Toast.makeText(DuelGame.this, "+1 Lose!", Toast.LENGTH_SHORT).show(); }) .addOnFailureListener(e -> { Toast.makeText(DuelGame.this, "Data error!", Toast.LENGTH_SHORT).show(); }); });
补充说明
如果对计数准确性要求高,可以在初始化逻辑执行完成前,将两个胜负按钮设置为不可点击状态,等onDataChange回调拿到初始值后再恢复按钮可点击状态,避免极端场景下的计数偏差。
内容的提问来源于stack exchange,提问作者Biron al-Quppī
相关产品推荐
相关产品推荐

