Почему Firebase всегда скачивает все данные? - PullRequest
1 голос
/ 07 февраля 2020

Я работаю над вопросом с несколькими ответами. Есть около тысячи вопросов. Я сгруппировал их отдельно. Но когда я запускаю приложение и захожу в любую группу вопросов, я думаю, что она загружает все группы вопросов, она загружает все данные. Это будет означать, что мой лимит заполняется очень быстро. Можете ли вы помочь мне решить эту проблему?

Профиль базы данных

Правила Firebase

Данные

myRef.child("SETS").child(category).child("questions").orderByChild("setNo").equalTo(setNo).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                list.add(snapshot.getValue(QuestionModel.class));
            }

РЕДАКТИРОВАТЬ (проблема решена)

  {
"rules": {
  ".read": true,
    ".write": false,
  "SETS": {
    "$category": {
      "questions": {
        ".indexOn": "setNo"

      }
    }
  }

Change

И результат потрясающий! Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2020

Если вы видите, что Firebase загружает все вопросы, а не только те, которые соответствуют условию вашего запроса, вы, вероятно, пропускаете необходимый индекс в своих серверных правилах. Серверу базы данных нужен такой индекс, иначе он не сможет выполнить заказ / фильтр и просто отправит все данные клиенту (который затем упорядочит / отфильтрует).

Для вас этот индекс будет посмотрите что-нибудь:

"SETS": {
  "$category": {
    "questions": {
      ".indexOn": "setNo"
    }
  }
}

Полную документацию по добавлению индексов в ваши правила смотрите Индексация данных .

С этими правилами сервер Firebase создаст индекс под questions всех setNo значений дочерних узлов и использует его для упорядочения / фильтрации.

0 голосов
/ 07 февраля 2020

Вы скачиваете всю категорию. Читайте по одному.

myRef.child("SETS").child(category).child("questions").child(setNo).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                list.add(snapshot.getValue(QuestionModel.class));
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...