Я выполняю запрос к базе данных Firebase.Я пытаюсь получить профили по имени вложенного дочернего элемента для каждого нажатия клавиши на клавиатуре для SearchView.Я также использую задержку 1500 мсек между каждым вызовом, поэтому я не буду звонить много раз.Я пытаюсь понять, почему этот запрос занимает слишком много времени.
вот мой запрос -
private void fetchUsersFromTextSearch(String text) {
Query query = FirebaseDatabase.getInstance().getReference().child("profiles").orderByChild("name").startAt(text).endAt(text + "\uf8ff");
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
mProgressBar.setVisibility(View.GONE);
if (dataSnapshot.exists()) {
ArrayList<ExploreSearchUser> fetchedUsers = new ArrayList<>();
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
String name = snapshot.child("name").getValue(String.class);
String photoUrl = snapshot.child("photoUrl").getValue(String.class);
String UID = dataSnapshot.getKey();
ExploreSearchUser searchUser = new ExploreSearchUser(name, photoUrl, UID);
fetchedUsers.add(searchUser);
Timber.tag("similar users - ").d("name - " + name + "\n" + "photoUrl - " + photoUrl + "\n" + "UID - " + UID);
}
if (fetchedUsers.size() > 0) {
searchUsersList.clear();
searchUsersList.addAll(fetchedUsers);
mSearchResultTextTitle.setText(App.getAppContext()
.getString(R.string.explore_search_activity_profiles_containing_search_result).concat(text).concat("'"));
adapter.notifyDataSetChanged();
}
} else {
mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_no_profiles_containing).concat(text).concat("'"));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
mProgressBar.setVisibility(View.GONE);
mSearchResultTextTitle.setText("Error - " + databaseError.getMessage());
Timber.tag("similar users error - " + databaseError.getMessage());
}
});
}
Проблема заключается в том, что слишком долго, чтобы вернуть результаты в мой обзор переработчика.Примерно 10-15 секунд для каждого поиска, который можно использовать с пользой.Я спрашиваю что-то не так?
вот место, где я вызываю свою функцию -
mSearchView.setOnQueryTextListener(new androidx.appcompat.widget.SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
if (newText.length() == 1) {
mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_can_perform_search_limitation));
return false;
} else if (newText.length() > 1) {
mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_searching).concat(newText).concat("'..."));
mProgressBar.setVisibility(View.VISIBLE);
} else {
mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activity_fetching_recommended_profiles));
mProgressBar.setVisibility(View.VISIBLE);
}
searchTimer.cancel();
searchTimer = new Timer();
//timer task that delays network calls for better performance
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
runOnUiThread(() -> { //TODO - check this thread issue
searchUsersList.clear();
adapter.notifyDataSetChanged();
if (newText.length() < 1) {
mSearchResultTextTitle.setText(App.getAppContext().getString(R.string.explore_search_activitty_recommended_profiles));
fetchSixRandomProfiles();
} else {
fetchUsersFromTextSearch(newText);
}
});
}
};
searchTimer.schedule(timerTask, SEARCH_WITH_DELAY);
return false;
}
});
, поэтому мои вопросы - 1) Что заставляет запрос занимать так много времени?2) Как я могу добавить игнорирование чувствительности к регистру для моего запроса?Я видел несколько потоков об этой проблеме, но ничто не решило мою проблему, так как большинство из них сказали, что я должен получить всю таблицу и использовать «.toUppercase ()» для соответствующих строк ... что не является решением в моем случае, так как мойтаблица имеет 22k значений.Есть идеи, как мне это сделать?