android - Сравнение двух очень больших списков ArrayList, один из которых получен из firebase - PullRequest
0 голосов
/ 13 января 2020

Итак, теперь я пытаюсь отобразить мои контакты, которые существуют только в таблице «Users» базы данных firebase,

Итак, первый шаг - получить все мои контакты (все было сделано идеально менее чем за одну секунду) а второй - получить всех пользователей в моей базе данных уже для сравнения двух списков Arraylists, чтобы проверить, существует ли какой-либо из моих контактов в базе данных или нет, если существует, то отобразить их (на самом деле это сценарий)

и я уже сделал это, но это слишком медленный алгоритм, я уверен на 100%! ,

, если в базе данных два миллиона пользователей, а у меня 1000 контактов, то 1000 * 2 000 000 !! Потребуется вечность, чтобы отобразить мои контакты, которые существуют только в базе данных Firebase,

Есть ли какое-нибудь решение?

Вот мой код

      `
       // this means it will load the whole users from database !
        DatabaseReference  databaseReference = FirebaseDatabase.getInstance().getReference("Users");
        databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                contactsList.clear();

                // this algorithm means that if there is one million records it will loop through 
                 //all of them
                // then add all of them to the list
                // takes lots of time actually :(



                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    User user  = snapshot.getValue(User.class);

                    for(Contacts contacts : PhonecontactsList){
                        // if this user phone eqauals the phone we saved in the phone array list
                        if(user.getPhone().equals(contacts.getPhone())){
                            // if the user doesn't exist in the list
                            if (!contactsList.contains(user)) {
                                // add them
                                contactsList.add(new User(
                                        user.getId(),
                                        contacts.getUsername(),
                                        user.imageURL,
                                        user.getStatus(),
                                        user.getPhone(),
                                        user.getTyping_to(),
                                        user.getSearch(),
                                        user.getTimestamp()

                                ));
                            }


                        }
                    }


                }

                UsersAdapter usersAdapter = new UsersAdapter(getContext(), contactsList  , false);
                contactsRecycler.setAdapter(usersAdapter);
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

`

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

1 Ответ

3 голосов
/ 13 января 2020

Извлечение всех 1 миллиона записей из базы данных, размещенной в облаке, такой как база данных Firebase Realtime, - очень плохая идея. Нет никакой возможности быстро передать все эти записи по мобильному соединению. Конечному пользователю также может потребоваться большая часть их данных, чтобы получить весь этот набор.

Если вам нужно только узнать, какие из записей базы данных находятся в вашем локальном наборе данных, просто сделайте один запрос на каждый элемент в локальном наборе, и показать те, которые существуют. Вы можете игнорировать все остальное.

...