Как сравнить два дочерних узла из разных ссылок в Android Firebase? - PullRequest
0 голосов
/ 09 июня 2019

В Firebase у меня есть узел «Пользователи», где я храню информацию о зарегистрированных пользователях, и у меня есть узел «задачи» с информацией о задачах, созданной каждым пользователем, и 3 адреса электронной почты владельцев, добавленные к этим задачам вручную.Я пытаюсь сравнить поле электронной почты от пользователей с электронной почтой каждого владельца.Если текущая электронная почта пользователя является одной из трех электронных писем владельца, то я покажу только те задачи, к которым относится его электронная почта.

Это фрагмент из моей базы данных в реальном времени Firebase:

    "Users" : 
       {"SolD4tqjUJd1Xru3mRliwtoik2A3" : 
           { "email" : "x@gmail.com",

             "id" : "SolD4tqjUJd1Xru3mRliwtoik2A3",

            "name" : "AB",

            "phone" : "123456789"
           }
        },


     "tasks" : 
         { "-LgrtyuTjd2QpNIhUeEi" : 
              { "-Lgsjx1c-E6OU3t1SbhL" : 
                   { "id" : "-Lgsjx1c-E6OU3t1SbhL",

                     "owner_one" : "x@gmail.com",

                    "owner_three" : "y@gmail.com",

                    "owner_two" : "z@gmail.com",

                    "projectId" : "-LgrtyuTjd2QpNIhUeEi",

                    "taskDate" : "2019 / 6 / 5",

                    "taskDescription" : "dddd",

                    "taskName" : "ddddd",

                    "taskstatus" : "Closed",

                    "userId" : "SolD4tqjUJd1Xru3mRliwtoik2A3"
                  }
                }
               }
              }

Я попробовал следующий код, чтобы получить электронные письма от пользователей и владельцев от задач, но я застрял при сравнении электронной почты с email1, email2 и email3.

        myTasks = findViewById(R.id.myTasks);
        myTasks.setLayoutManager(new LinearLayoutManager(this));
        tasks = new ArrayList<>();

        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users");
    UsersRef.child(currentUserID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            String email = user.getEmail();
        }

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

        }
    });


    reference = FirebaseDatabase.getInstance().getReference().child("tasks");
    reference.addChildEventListener(new ChildEventListener(){


        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            //set code to retrieve data and replace layout

            for(DataSnapshot dataSnapshot1: dataSnapshot.getChildren()){
                Task p;
                p = dataSnapshot1.getValue(Task.class);
                String email1 = p.getOwner_one();
                String email2 = p.getOwner_two();
                String email3 = p.getOwner_three();

                tasks.add(p);
            }
            taskAdapter = new TaskAdapter(MyTasks.this, tasks);
            myTasks.setAdapter(taskAdapter);
            taskAdapter.notifyDataSetChanged();
        }

1 Ответ

0 голосов
/ 10 июня 2019

Нет необходимости создавать вызов базы данных, чтобы иметь возможность получить адрес электронной почты пользователя, вы можете просто получить адрес электронной почты непосредственно из объекта FirebaseUser, например:

String email = FirebaseAuth.getInstance().getCurrentUser().getEmail();

В соответствии со схемой вашей базы данных, обратите внимание, что вы не можете сделать запрос к своей базе данных, когда у вас есть два узла с динамически (выдвигаемыми) именами.В Firebase также нет подстановочных знаков.Чтобы решить эту проблему, вы должны уменьшить количество дочерних элементов, добавив идентификатор проекта в качестве свойства вашего объекта задачи.Теперь, чтобы получить все задачи, которые соответствуют определенному адресу электронной почты, используйте следующий запрос:

reference = FirebaseDatabase.getInstance().getReference().child("tasks");
Query firstQuery = reference.orderByChild("owner_one").equalsTo("x@gmail.com");

Это работает только с одним свойством.К сожалению, вы не можете выполнять запросы в базе данных реального времени Firebase, используя несколько предложений «WHERE» (в терминах SQL).Что вы можете сделать, это сделать запрос в базу данных три раза, по одному для каждого свойства владельца.Второй и третий запросы должны выглядеть следующим образом:

Query secondQuery = reference.orderByChild("owner_two").equalsTo("x@gmail.com");
Query thirdQuery = reference.orderByChild("owner_three").equalsTo("x@gmail.com");

Обратите внимание, что для получения желаемого результата вы должны использовать вложенные запросы, которые могут выглядеть следующим образом:

ChildEventListener childEventListener = new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        if(dataSnapshot.exists()) {
            //Perform the second query and then the third query
        }
    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {}

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {}

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {}

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
};
firstQuery.addChildEventListener(childEventListener);

Однако это проще сделать в Cloud Firestore , где вы можете добавить свойство типа array и использовать метод whereArrayContains () , подобный этому:

tasksRef.whereArrayContains("owners", "x@gmail.com");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...