java - Android Firebase 数据库不断更新价值
问题描述
我正在尝试从 Firebase 实时数据库中获取作者分数。我成功获得了分值。然后我在这个值上添加 100 并插入新值,但是当我插入分数值时,分数值会不断增加 100,例如,如果分数为 500 而不是更改为 600,它将更改为 600,然后是 700,然后是 800 等。如果我在方法中显示 Toast,addExtraScore
它将按预期显示一次。
活动
private void getAuthorScore()
{
database = FirebaseDatabase.getInstance().getReference();
database.child("Users").child(authorID).addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot)
{
User author = dataSnapshot.getValue(User.class);
authorScore = author.getScore();
addExtraScore();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
}
private void addExtraScore()
{
int score = authorScore + 100;
FirebaseUtil.updateUsersScore(authorID, score);
}
Firebase Util 私有静态数据库参考数据库;
public static void updateUsersScore(String id, int score)
{
db = FirebaseDatabase.getInstance().getReference();
db.child("Users").child(id).child("score").setValue(score);
}
解决方案
要解决此问题,请更改以下代码行:
database.child("Users").child(authorID).addValueEventListener(/* ... */);
至
database.child("Users").child(authorID).addListenerForSingleValueEvent(/* ... */);
只获取一次数据。使用addValueEventListener()
它意味着您可以实时获取数据,并且每次更改onDataChange()
都会被再次调用。
推荐阅读
- rust - 您如何实现 H256 的特征 TypeInfo?
- azure - Azure Kubernetes 服务 - 持久卷/持久卷声明更改权限
- sql - 查询数据库 Laravel
- ios - 如果从移动设置或后台打开应用程序,则更新屏幕上的数据
- javascript - iOS DeviceOrientationEvent API 和打字稿
- angular - 如果我动态为其分配值但未单击,如何防止更改事件触发?
- c# - .net Apps 中的临时文件夹名称和文件夹树是如何形成的?
- octave - 八度:平滑值系列(不是经典的移动平均线)
- c - 如何在c的输出中删除额外的“\ n”
- linux - Azure AKS 使用 ssh 在群集节点上执行命令