我编写了一个用于验证目的的代码。我通过变量创建了从数据中获取内容的变量,它们工作得很好,但是当我将存储的数据与用户想要存储的数据进行比较时,检查然后保留存储数据,直到我强行关闭应用程序。下面是代码
private void checkThedatafirest() {
AppointmentREf.child("Appointments").child(userId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()){
StartBusinse= mDisplayDate.getText().toString();
sAppoint = sTimeApp.getText().toString();
eAppoint = eTimeApp.getText().toString();
for (DataSnapshot snapshot: dataSnapshot.getChildren()){
String StartTime = snapshot.child("startFirstAppoint").getValue().toString();
String EndTime = snapshot.child("endSecondAppointment").getValue().toString();
String Date = snapshot.child("startBusinse").getValue().toString();
if (!StartBusinse.equals(Date)&& !sAppoint.equals(StartTime)&&!eAppoint.equals(EndTime)){
sendDataTofireStore();
break;
}else {
Toast.makeText(AppointmentInfo.this, "The data already exist , please change ",Toast.LENGTH_SHORT).show();
}
break;
}
}else {
sendDataTofireStore();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
最佳答案
很难从您共享的代码中确定,但通常这种行为是由更新您监听的数据引起的。如果是这样的话,流程如下:
- 您将监听器附加到某些数据
- Firebase 读取该数据并调用您的
onDataChange
- 您对数据进行更改,并将其写入数据库
- Firebase 检测到该更改,并调用
onDataChange
- 返回#3
解决方案是要么不写入您读取的数据,要么确保数据只监听一次。正确的解决方案取决于用例,但场景 2 最简单的情况肯定是使用 addListenerForSingleValueEvent
:
AppointmentREf.child("Appointments").child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
...
关于java - 如何打破Firebase实时无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52466657/