База данных Firebase выполняет SQL-подобный запрос с глубоко вложенными дочерними элементами - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть текст для редактирования.Я наблюдаю за изменением текста на каждой букве, и для каждого добавленного письма я хочу запросить запрос в firebase, предоставляя мне результаты с добавлением этих букв.Поэтому я попробовал следующее решение, предлагаемое здесь -

Как выполнить простой поиск по строке в базе данных Firebase?

, и, похоже, оно не работает.

В моей базе данных есть следующие профили JSON:


{
  "002xUGm1uRXDYc8JpEy7AKFWFyy2" : {
    "contest_uid" : "-LRoyQlTw5vo3CIE3tfb",
    "created_at" : 1543726522,
    "device_id" : "354020096008438",
    "email" : "koushickroy321@gmail.com",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1543726522,
    "last_upload_started_at" : 0,
    "name" : "gold rush eren patym cash patym",
    "photoUrl" : "*"
  },
  "00IumwilishPwTgPUXX6GmveP5w2" : {
    "contest_uid" : "-LRoyQlTw5vo3CIE3tfb",
    "created_at" : 1543214441,
    "device_id" : "865758030661505",
    "email" : "khushyouheart@gmail.com",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1543214441,
    "last_upload_started_at" : 0,
    "name" : "Khushal Chouhan",
    "photoUrl" : "*"
  },
  "00TRPNqSi1R41F4SUuhHOgHBdkN2" : {
    "contest_uid" : "-LO3Eg7zf1xh9RGDUy0e",
    "created_at" : 1541355818,
    "device_id" : "357149084088198",
    "is_suspended" : false,
    "is_uploading" : false,
    "last_login_at" : 1541355818,
    "last_upload_started_at" : 0,
    "name" : "Gagan Singh Gaur",
    "photoUrl" : "*"
  },


, и вот что я уже пытался сделать -


mExploreSearchEditText.addTextChangedListener(new TextWatcher() {
      @Override
      public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

      }

      @Override
      public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {


      }

      @Override
      public void afterTextChanged(Editable editable) {
          if (editable.length() < 1) {
            mExploreSearchRecommendedProfiles.setVisibility(View.VISIBLE);
            fetchSixRandomProfiles();
          } else {
            mExploreSearchRecommendedProfiles.setVisibility(View.GONE);
            fetchNewListFromEditable(editable);
          }
      }
    });
  }

  private void fetchNewListFromEditable(Editable editable) {
    String text = editable.toString();
    Query query = FirebaseDatabase.getInstance().getReference().child("profiles").orderByChild("").startAt(text).endAt(text +"\uf8ff");
    query.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
          String users = dataSnapshot.getValue(String.class);
          Timber.tag("similar users").d(users); // <-- I have never got to this point 
        } else {
          Toast.makeText(App.getAppContext(), "snapshot does not exist", Toast.LENGTH_SHORT).show();
        }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {
        Timber.tag("similar users error - " + databaseError.getMessage());
      }
    });
  }


Что мне нужно для каждогодобавлено письмо, запросить всю таблицу «профилей», если имя профиля содержит всю последовательность символов с самого начала, тогда мне нужно имя и photoURL.Как лучше всего достичь этого результата?

1 Ответ

1 голос
/ 24 сентября 2019

Примерно так должно получиться:

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) {
    if (dataSnapshot.exists()) {
      for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
        String users = snapshot.child("name").getValue(String.class);
        Timber.tag("similar users").d(users);
      }
    } else {
      Toast.makeText(App.getAppContext(), "snapshot does not exist", Toast.LENGTH_SHORT).show();
    }
  }

  @Override
  public void onCancelled(@NonNull DatabaseError databaseError) {
    Timber.tag("similar users error - " + databaseError.getMessage());
  }
})

Изменения:

  • Используйте orderByChild("name") для упорядочения / фильтрации профилей по значению свойства name.
  • В onDataChange зацикливаться на дочерних элементах, поскольку запрос может иметь несколько результатов.
  • Необходимо получить правильное значение свойства из каждого дочернего снимка, поэтому snapshot.child("name").getValue(String.class)

Что я еще не сделал:

  • Показать список пользователей в результатах поиска.Если вам это нужно, обратите внимание на создание собственного адаптера и вызов notifyDataSetChanged().
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...