将数据插入firebase-Android-并检查特定属性
我需要将lesson对象插入firebase,所以我将代码的onData更改部分放在这里。 首先,我获取数据快照并插入firebase中的课程,然后扫描课程列表并检查: 如果任何课程中的firebase中存在日期和时间,,因此我会执行其他操作,我会将课程对象插入firebase。 主要问题是: 当我插入课程的详细信息并按add键时,课程将至少两次进入firebase,如果我尝试另一次插入,程序将进入无限循环。 我很高兴能得到任何帮助将数据插入firebase-Android-并检查特定属性,android,firebase-realtime-database,Android,Firebase Realtime Database,我需要将lesson对象插入firebase,所以我将代码的onData更改部分放在这里。 首先,我获取数据快照并插入firebase中的课程,然后扫描课程列表并检查: 如果任何课程中的firebase中存在日期和时间,,因此我会执行其他操作,我会将课程对象插入firebase。 主要问题是: 当我插入课程的详细信息并按add键时,课程将至少两次进入firebase,如果我尝试另一次插入,程序将进入无限循环。 我很高兴能得到任何帮助 ArrayList<Lesson> exis
ArrayList<Lesson> existLesson=new ArrayList<>();
List<String> keys = new ArrayList<>();
int counter=0;
public void getLessons(DataSnapshot dataSnapshot){
//insert the lessons to "existLesson" arrayList
for (DataSnapshot keyNode : dataSnapshot.getChildren()) {
keys.add(keyNode.getKey());
Lesson lesson = keyNode.getValue(Lesson.class);
existLesson.add(lesson);
Log.i(tag, "data : " + lesson.getSubject());
}//for
}
int flag=1;
@Override
public void addLesson(final String subject, final String topic, final String date, final String time) {
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
getLessons(dataSnapshot);
//Check if date and time is busy
for (Lesson lessonToCheck : existLesson) {
if (lessonToCheck.getDate().equals(date) && lessonToCheck.getTime().equals(time)) {
flag = 0;
} else {
flag = 1;
}
}//for
if (flag == 0) {
Toast.makeText(LessonDetails.this, "date exist", Toast.LENGTH_SHORT).show();
// Check empty lessons
nearestLessons(existLesson, date, time);
} else {
if (flag == 1) {
String id = mDatabase.push().getKey();
Lesson lesson = new Lesson(subject, topic, date, time, id); //create lesson
Toast.makeText(LessonDetails.this,
subject + " - " + topic + " - " + date + " - " + time, Toast.LENGTH_SHORT).show();
mDatabase.child(id).setValue(lesson);
} //add lesson to DB
} //else
Log.i(tag,"end");
} //onDataChange
ArrayList existLesson=new ArrayList();
列表键=新的ArrayList();
int计数器=0;
公共void getLessons(DataSnapshot DataSnapshot){
//将课程插入“existLesson”arrayList
对于(DataSnapshot键节点:DataSnapshot.getChildren()){
添加(keyNode.getKey());
lessource=keyNode.getValue(lessource.class);
existLesson.add(课程);
Log.i(标记,“数据:+lesson.getSubject());
}//为了
}
int标志=1;
@凌驾
public void addLesson(最终字符串主题、最终字符串主题、最终字符串日期、最终字符串时间){
mDatabase.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
getLessons(dataSnapshot);
//检查日期和时间是否繁忙
用于(第1课检查:existLesson){
如果(lessonToCheck.getDate().equals(date)&&lessonToCheck.getTime().equals(time)){
flag=0;
}否则{
flag=1;
}
}//为了
如果(标志==0){
Toast.makeText(LessonDetails.this,“日期存在”,Toast.LENGTH_SHORT.show();
//检查空课
最近的课程(现有课程、日期、时间);
}否则{
如果(标志==1){
字符串id=mDatabase.push().getKey();
Lesson Lesson=新课程(主题、主题、日期、时间、id);//创建课程
Toast.makeText(LessonDetails.this,
主题+“-”+主题+“-”+日期+“-”+时间,土司。长度(短)。show();
mDatabase.child(id).setValue(课程);
}//将课程添加到数据库
}//否则
Log.i(标记“结束”);
}//onDataChange
当您调用时,您将在
处向数据添加一个侦听器。此侦听器将立即读取数据并调用您的onDataChange
,然后继续侦听数据的更新
对于数据的每次更新,它都会再次调用您的onDataChange
。由于您正在更新onDataChange
中的数据,这将导致setValue
->onDataChange
->设置值
->onDataChange
->
要解决此问题,通常使用addListenerForSingleValueEvent
,因为它只获取一次值,不会继续侦听更改
比如:
mDatabase.addForListenerValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
getLessons(dataSnapshot);
//Check if date and time is busy
for (Lesson lessonToCheck : existLesson) {
if (lessonToCheck.getDate().equals(date) && lessonToCheck.getTime().equals(time)) {
flag = 0;
} else {
flag = 1;
}
}//for
if (flag == 0) {
Toast.makeText(LessonDetails.this, "date exist", Toast.LENGTH_SHORT).show();
// Check empty lessons
nearestLessons(existLesson, date, time);
} else {
if (flag == 1) {
String id = mDatabase.push().getKey();
Lesson lesson = new Lesson(subject, topic, date, time, id); //create lesson
Toast.makeText(LessonDetails.this,
subject + " - " + topic + " - " + date + " - " + time, Toast.LENGTH_SHORT).show();
mDatabase.child(id).setValue(lesson);
} //add lesson to DB
} //else
Log.i(tag,"end");
} //onDataChange
})
注意到,由于您根据当前值更新数据,所以有可能另一个用户几乎在同一时间做相同的操作。如果这会导致用例中的冲突更新,请考虑将代码中的读和写结合为单个(可重复的)操作。