Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据插入firebase-Android-并检查特定属性_Android_Firebase Realtime Database - Fatal编程技术网

将数据插入firebase-Android-并检查特定属性

将数据插入firebase-Android-并检查特定属性,android,firebase-realtime-database,Android,Firebase Realtime Database,我需要将lesson对象插入firebase,所以我将代码的onData更改部分放在这里。 首先,我获取数据快照并插入firebase中的课程,然后扫描课程列表并检查: 如果任何课程中的firebase中存在日期和时间,,因此我会执行其他操作,我会将课程对象插入firebase。 主要问题是: 当我插入课程的详细信息并按add键时,课程将至少两次进入firebase,如果我尝试另一次插入,程序将进入无限循环。 我很高兴能得到任何帮助 ArrayList<Lesson> exis

我需要将lesson对象插入firebase,所以我将代码的onData更改部分放在这里。 首先,我获取数据快照并插入firebase中的课程,然后扫描课程列表并检查: 如果任何课程中的firebase中存在日期和时间,因此我会执行其他操作,我会将课程对象插入firebase。 主要问题是: 当我插入课程的详细信息并按add键时,课程将至少两次进入firebase,如果我尝试另一次插入,程序将进入无限循环。 我很高兴能得到任何帮助

   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
})

注意到,由于您根据当前值更新数据,所以有可能另一个用户几乎在同一时间做相同的操作。如果这会导致用例中的冲突更新,请考虑将代码中的读和写结合为单个(可重复的)操作。