Я храню список пользователей в Firebase. Структура выглядит так:
В моем приложении для Android я хочу позволить пользователю гибко искать любого пользователя. Поэтому Джон Смит должен отображаться в результатах, если пользователь ищет такие вещи, как: Joh ..., Smit ..., jsmi ... . Кроме того, я хочу, чтобы результаты поиска отображались мгновенно по мере ввода пользователем текста (например, Instagram).
В настоящее время это моя реализация. Я открываю все данные пользователя, когда открывается поисковая операция, и сохраняю все данные в ArrayList
. Затем, когда пользователь начинает поиск, я ищу ArrayList
и возвращаю совпадения.
Ниже приведен пример кода:
ArrayList<User> listOfUsers = new ArrayList<>();
ref.child("Users").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) {
User user = userSnapshot.getValue(User.class);
listOfUsers.add(user);
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
// Then I search for users like this
for (User user : listOfUsers) {
if (user.getFullname.contains("Joh") ||
user.getUsername.contains("Joh")){
// show user in results
}
}
Прямо сейчас работает нормально, потому что у меня не так много пользователей. Но я чувствую, что если у меня есть 100 тыс. Пользователей, то вытащить все их детали заранее и проанализировать список массивов из 100 тыс. Элементов для поиска совпадений может оказаться дорогостоящим. Что было бы лучшим решением?