Множественный запрос и ссылка на базу данных Firebase Android - PullRequest
0 голосов
/ 31 октября 2018

Моя база данных Firebase выглядит так:

database

Из этого запроса

String currentUserID = FirebaseAuth
                            .getInstace()
                            .getCurrentUser()
                            .getUid();

DatabaseReference favorsRef = FirebaseDatabase
                                        .getInstance()
                                        .getReference()
                                        .child("favors");
Query myChatsQuery = favorsRef
                        .orderByChild("uid")
                        .equalTo(currentUserID);

Мне нужно создать другой запрос, чтобы получить только кортежи из myChatsQuery, чей дочерний элемент называется "messages". Если у кортежа нет дочерних «сообщений», я не хочу вставлять его в мой новый запрос.

Итак, как мне создать запрос из другого запроса?

Помогите мне, пожалуйста,

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Чтобы решить эту проблему, используйте следующий код:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("favors").orderByChild("uid").equalTo(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            if(ds.child("messages").exists()) {
                //Do what you need to do
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

Как видите, вы можете решить эту проблему, выполнив запрос к базе данных только один раз.

0 голосов
/ 31 октября 2018

К сожалению, orderByChild() не работает на нескольких одних и тех же полях одновременно, поэтому вам, возможно, придется выполнить работу в два этапа.

Сначала вы можете запустить запрос orderByChild() для поиска currentUserId, а затем добавить все те, которые соответствуют ArrayList, а затем запустить orderByChild() в найденных uids для messages.

Это выглядит примерно так, в коде:

reference.orderByChild("uid").equalTo(currentUserId).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                            if(dataSnapshot.exists())
                              array.add(dataSnapshot.getValue(String.class);
                        }

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

                        }
                  )};

Приведенный выше код добавляет uids соответствие currentUserId в ArrayList array.

databaseReference.child(array.get(0)).addListenerForSingleValueEvent(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                           if(dataSnapshot.child("messages").exists())
                           // do your thing

                        }

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

                        }

                    )};    

Вы также можете просто использовать цикл for для просмотра всех значений в array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...