作者:辣妈最___潮 | 来源:互联网 | 2023-02-06 17:09
我正在尝试使用Firebase为餐厅和酒吧创建评分系统。到目前为止,我已经能够读写各个等级。我遇到的问题是,为了计算特定餐厅的平均评分,我需要获取已存储的评分数量和所有已存储评分的总价值。目前,我正在努力存储评分值。这是我的代码
Query RetrieveRating = databaseReference.child("ratings").child("porterhouse");
RetrieveRating.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot postSnapshot) {
//get data from snapshot
String data = postSnapshot.child("numRating").getValue().toString();
if (!data.equals(null)) {
String numRating = (String) postSnapshot.child("numRating").getValue();
count = Integer.valueOf(numRating);
count++;
ratingCounter = Integer.toString(count);
databaseReference.child("ratings").child("porterhouse").child("numRating").setValue(ratingCounter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
发生的事情是,它正在获取当前存储的值,将其加1并将其写回数据库,但是,每次存储onDataChange()方法时,都会调用一次,再次加1并无限循环。我的问题是,可以进行任何更改以防止这种情况发生,甚至可以通过其他方式进行配置吗?谢谢
更新
json代码如下:
{
"ratings" : {
"porterhouse" : {
"numRating" : "0",
"totalRating" : "0"
}
}
Martin De Si..
6
使用addListenerForSingleValueEvent
RetrieveRating.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot postSnapshot) {
//get data from snapshot
String data = postSnapshot.child("numRating").getValue().toString();
if (!data.equals(null)) {
String numRating = (String) postSnapshot.child("numRating").getValue();
count = Integer.valueOf(numRating);
count++;
ratingCounter = Integer.toString(count);
databaseReference.child("ratings").child("porterhouse").child("numRating").setValue(ratingCounter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
您还应该使用Firebase事务来增加计数器
1> Martin De Si..:
使用addListenerForSingleValueEvent
RetrieveRating.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot postSnapshot) {
//get data from snapshot
String data = postSnapshot.child("numRating").getValue().toString();
if (!data.equals(null)) {
String numRating = (String) postSnapshot.child("numRating").getValue();
count = Integer.valueOf(numRating);
count++;
ratingCounter = Integer.toString(count);
databaseReference.child("ratings").child("porterhouse").child("numRating").setValue(ratingCounter);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
您还应该使用Firebase事务来增加计数器