【问题标题】:SwitchCompat is not working properly with firebase databaseSwitchCompat 无法与 firebase 数据库一起正常工作
【发布时间】:2019-11-15 12:03:23
【问题描述】:

我的 android 项目中有 firebase 数据库,其中包含三个值:代码、电子邮件、日期。我正在使用 switchcompat 来计算 firebase 数据库中的在校学生。当检查开关时,数据将进入firebase数据库,检查电子邮件在特定日期是否唯一。取消选中开关时,将删除当前日期的数据。但我的问题是,当我第一次检查开关时,它工作正常。并且在取消选中一次开关后的第二次,当我再次检查它时,它会将数据输入到firebase,但即使仍然选中开关,它也会立即自动删除它。我不明白我的代码中的问题在哪里。 我在下面提供了我的代码,用于 SwitchCompat 的工作。 代码如下:

switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Date c = Calendar.getInstance().getTime();
            SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
            final String date = df.format(c);
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, -1);
            final String previousDate = df.format(cal.getTime());
            final int[] i = {0};
            if (switch1.isChecked()) {
                Query equery = present.orderByChild("email").equalTo(email);
                equery.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        if (!dataSnapshot.exists()) {
                            String code = "1";
                            PresentStu presentStu = new PresentStu(FirebaseAuth.getInstance().getCurrentUser().getEmail(), date, code);
                            String uploadId = present.push().getKey();
                            present.child(uploadId).setValue(presentStu);
                        } else {
                            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                                String eemail = snapshot.child("email").getValue().toString();
                                String ddate = snapshot.child("date").getValue().toString();
                                if (eemail.equals(eemail) && ddate.equals(date)) {
                                    i[0]++;
                                    break;
                                }
                            }
                           // Toast.makeText(User.this,""+i[0]+"",Toast.LENGTH_SHORT).show();
                                if (i[0] < 1){
                                    String code = "1";
                                    PresentStu presentStu = new PresentStu(FirebaseAuth.getInstance().getCurrentUser().getEmail(), date, code);
                                    String uploadId = present.push().getKey();
                                    present.child(uploadId).setValue(presentStu);
                                }
                            }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            } else {
                Query equery = present.orderByChild("email").equalTo(email);
                equery.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                            String eemail = snapshot.child("email").getValue().toString();
                            String ddate = snapshot.child("date").getValue().toString();
                            if (eemail.equals(eemail) && ddate.equals(previousDate)) {
                                present.child(dataSnapshot.getChildren().iterator().next().getKey()).child("code").setValue("0");
                            }
                            if (eemail.equals(eemail) && ddate.equals(date)) {
                                snapshot.getRef().removeValue();
                                break;
                            }
                        }

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });
            }
        }
    });

请帮我找出我的代码中缺少的地方。

My database structure

【问题讨论】:

  • 这是因为你调用了equery.addValueEventListener():这不是一次性事件监听器,而是每次都会调用。如果您打开、关闭和再次打开它,它有 3 个事件侦听器。把事件监听改成普通查询就好了。
  • Michiel,你能给我推荐一个普通的查询示例吗?

标签: java android firebase firebase-realtime-database switchcompat


【解决方案1】:

因为我不知道你数据库的结构,所以不能简单地复制/粘贴这个sn-p;这是您自己的代码,移除了事件侦听器。

使用正确的方式获取快照的正确路径并直接进行更改,而无需等待数据更改。

switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            Date c = Calendar.getInstance().getTime();
            SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");
            final String date = df.format(c);
            Calendar cal = Calendar.getInstance();
            cal.add(Calendar.DATE, -1);
            final String previousDate = df.format(cal.getTime());
            final int[] i = {0};
            if (switch1.isChecked()) {
                Query equery = present.orderByChild("email").equalTo(email);
                // TODO Change this:
                DataSnapshot dataSnapshot = equery.doSomethingToGettheSnapshot()

                        if (!dataSnapshot.exists()) {
                            String code = "1";
                            PresentStu presentStu = new PresentStu(FirebaseAuth.getInstance().getCurrentUser().getEmail(), date, code);
                            String uploadId = present.push().getKey();
                            present.child(uploadId).setValue(presentStu);
                        } else {
                            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                                String eemail = snapshot.child("email").getValue().toString();
                                String ddate = snapshot.child("date").getValue().toString();
                                if (eemail.equals(eemail) && ddate.equals(date)) {
                                    i[0]++;
                                    break;
                                }
                            }
                           // Toast.makeText(User.this,""+i[0]+"",Toast.LENGTH_SHORT).show();
                                if (i[0] < 1){
                                    String code = "1";
                                    PresentStu presentStu = new PresentStu(FirebaseAuth.getInstance().getCurrentUser().getEmail(), date, code);
                                    String uploadId = present.push().getKey();
                                    present.child(uploadId).setValue(presentStu);
                                }
                            }
                    }

            } else {
                Query equery = present.orderByChild("email").equalTo(email);

                // TODO Change this:
                DataSnapshot dataSnapshot = equery.doSomethingToGettheSnapshot()

                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                            String eemail = snapshot.child("email").getValue().toString();
                            String ddate = snapshot.child("date").getValue().toString();
                            if (eemail.equals(eemail) && ddate.equals(previousDate)) {
                                present.child(dataSnapshot.getChildren().iterator().next().getKey()).child("code").setValue("0");
                            }
                            if (eemail.equals(eemail) && ddate.equals(date)) {
                                snapshot.getRef().removeValue();
                                break;
                            }
                        }

                    }
            }
        }
    });

【讨论】:

  • Michiel,我在我的问题中添加了我的数据库结构。请看一下
  • 你自己试过什么,什么没用?
猜你喜欢
  • 2019-05-12
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
相关资源
最近更新 更多