我正在使用此功能检查数据库中是否存在特定日期,但是每次都会出错,并且数据库中的新日期也会更新
private boolean dateCheck() {
dateKey = false;
final ProgressDialog pg = new ProgressDialog(AdminMain.this);
pg.setMessage("Validating Date");
pg.setCanceledOnTouchOutside(false);
pg.setCancelable(false);
pg.show();
final DatabaseReference dbDate = FirebaseDatabase.getInstance().getReference("Dates").child(batch).child(sem);
dbDate.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild(date)) {
pg.dismiss();
Snackbar.make(findViewById(android.R.id.content), "Attendance has been already sumbitted", Snackbar.LENGTH_LONG).show();
dateKey = false;
} else {
dateKey = true;
dbDate.child(date).setValue(true);
pg.dismiss();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Snackbar.make(findViewById(android.R.id.content), databaseError.getMessage(), Snackbar.LENGTH_SHORT).show();
pg.dismiss();
dateKey=false;
}
});
return dateKey;
}
答案 0 :(得分:2)
作为方法的结果返回布尔值dateKey
时,总是返回首先分配的值false
。之所以发生这种情况,是因为返回该结果时尚未触发onDataChange()
中存在的if语句,因此始终为false。因此,onDataChange()
方法在调用后立即返回,并且它返回的Task中的回调将在一段时间后被调用。
不能保证需要多长时间。因此,可能需要几百毫秒到几秒钟的时间才能获得该数据。基本上,您试图从异步的API同步返回值。那不是一个好主意。您应该按预期异步处理API。
此问题的快速解决方案是仅在dateKey
方法内使用布尔值onDataChange()
,否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。