Java 在没有OnClickListener的Android应用程序中检索Firebase数据
我试图获得Firebase数据库表中特定列的总和,以生成Android应用程序中某个值的平均值(与当前读数对比)。作为一个测试,我想在我的测试应用程序的文本视图中显示这个总和。当我第一次声明addValueEventListener时:Java 在没有OnClickListener的Android应用程序中检索Firebase数据,java,android,firebase,firebase-realtime-database,Java,Android,Firebase,Firebase Realtime Database,我试图获得Firebase数据库表中特定列的总和,以生成Android应用程序中某个值的平均值(与当前读数对比)。作为一个测试,我想在我的测试应用程序的文本视图中显示这个总和。当我第一次声明addValueEventListener时: reff.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot sna
reff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot snapshot2: snapshot.getChildren()){
sum = sum + snapshot2.child("age").getValue(Integer.class);
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
然后进行数据库setValue()调用,并在onClickListener中设置textView,这将按预期工作
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
reff.child(String.valueOf(maxid+1)).setValue(member);
Toast.makeText(MainActivity.this, "data inserted successfully", Toast.LENGTH_LONG).show();
a.setText(String.valueOf(sum));
}
});
但是,在我的应用程序中,我不希望通过单击按钮触发“总和”值。我希望这是目前,以便我可以比较新的数据与滚动平均从我的数据库。如果我将上述代码从OnClickListener移动到我的主onCreate方法中,sum的值将保持为0。在阅读各种线程时,我还将addValueEventListener()替换为addListenerForSingleValueEvent(),但这没有任何影响
有谁能建议一种方法,我可以重新格式化它,而不必依靠按下按钮从我的表中获取总和?对
a.setText()
的调用需要在onDataChange
中,因为当更新的数据来自数据库时,这是唯一保证执行的代码
因此:
另外:请永不将onCancelled
保留为空,因为这样会忽略潜在的错误
另请参见:,我将以重复的方式结束您的问题-我只是想用代码向您展示相关的解决方案。这非常有帮助,谢谢!只是,作为后续,并不是说我的初始代码非常有洞察力,而是我还想尝试使用计数器对象(在我的示例中为“maxid”)来识别每个数据库条目,而不是随机生成每个数据库条目的Firebase值。问题在于能否将getChildrenCount()的数值传递到onDataChange()之外。我也读了你关于这个问题的另一篇文章。如果我尝试使用精确的getChildrenCount()对onDataChange()内的数据库进行更改,则会出现一个无限循环。是的,最重要的是,使用数据库中数据的任何代码都必须位于
onDataChange
内,或者从那里调用。范围(使用变量的代码所在的位置)没有多大关系,但是只有从onDataChange
触发它,时间才会正确。
reff.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot snapshot2: snapshot.getChildren()){
sum = sum + snapshot2.child("age").getValue(Integer.class);
}
a.setText(String.valueOf(sum));
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
throw error.toException();
}
});