我正在开发一种考勤管理系统。如果用户的出勤已被标记为当前日期,我希望显示一条敬酒消息,否则我想设置他们的出勤。
我正在使用新日期作为出勤键。现在,我要检查新日期是否已在节点中。
您可以在下图中看到我的数据库的格式。
现在在mktime
中,我想检查当前日期是否可用并上传出席人数,否则请显示祝酒词,表明已经标记了出席人数。
我该怎么做?
addValueEventListener
答案 0 :(得分:1)
由于您错过了问题中的某些信息,因此我做出了以下假设:
userId
中的日期在存储在字符串date
中的用户ID。AttendRef
是指向DatabaseReference
的{{1}} 首先,我强烈建议您将日期存储的方式更改为ISO 8601格式。在Java中,这由格式Users/{userId}/Attendance
给出。原因是Firebase会正确地将日期从最旧到最新进行排序。
根据您的问题和上述假设,您可以直接查询数据库中的数据,而不必浪费所有资源在“考勤”下下载所有数据,然后进行遍历。
"yyyy-MM-dd"
在上面的代码中,使用SimpleDateFormat DB_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
DatabaseReference DB_ROOT_REF = FirebaseDatabase.getInstance().getReference();
String userId = "bq7TqEwgluSiNRP7FDKanHptd9C2"; // the user to lookup
String date = DB_DATE_FORMAT.format(new Date()); // save attendance for today's date
DatabaseReference AttendRef = DB_ROOT_REF.child("Users").child(userId).child("Attendance");
AttendRef.child(date).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
// If data exists, toast currently stored value. Otherwise, set value to "Present"
if (dataSnapshot.exists()) {
Toast.makeText(ProfileAct.this, "Already marked as '" + dataSnapshot.getValue(String.class) + "'", Toast.LENGTH_SHORT).show();
} else {
dataSnapshot.getRef().setValue("Present");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
//TODO: Handle this
}
});
很重要,否则此侦听器将由于addListenerForSingleValueEvent(...)
而触发自身。