Geofire срабатывает поGeoQueryReady вместо onKeyEntered

Я хочу получить данные из базы данных firebase с запросом местоположения geofire, но он просто срабатывает onGeoQueryReady вместо onKeyEntered.

Я устанавливаю свое местоположение следующим образом

user = auth.getCurrentUser().getUid();
 GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(Education).child(CoachingCenter));



 geoFire.setLocation(user, new GeoLocation(latitude, longitude), new GeoFire.CompletionListener() {
                @Override
                public void onComplete(String key, DatabaseError error) {




                }
            });




        }
    });

и извлечение данных, подобных этому

GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(Education).child(CoachingCenter));
GeoQuery geoQuery = geoFire.queryAtLocation((location), Raius);

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            getShoplist(key);
        }

        @Override
        public void onKeyExited(String key) {
            getShoplist(key);
        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {
        }

        @Override
        public void onGeoQueryReady() {
        }

        @Override
        public void onGeoQueryError(DatabaseError error) {
        }
    });

Этот запрос не получает данные.

Вот моя структура базы данных

введите здесь описание изображения

Вот мои правила безопасности firebase

{"rules": {
".read": "auth != null",
".write": "auth != null"}}

Нужно ли мне изменить правила безопасности firebase для использования geofire?

Пожалуйста, помогите мне!


person sam    schedule 20.10.2018    source источник
comment
У нас нет возможности узнать, указывает ли GeoFire geoFire = new GeoFire(ref.child("businesLocation").child(shop_categoryName).child(shop_sub_categoryName)) на данные, показанные на скриншоте. Попробуйте воспроизвести проблему в изолированной минимальной структуре данных. Я настоятельно рекомендую прочитать как создать минимальный, полный, проверяемый пример, чтобы узнать, почему и как это сделать.   -  person Frank van Puffelen    schedule 20.10.2018
comment
@FrankvanPuffelen, я только что добавил более подробную информацию. пожалуйста, взгляните   -  person sam    schedule 21.10.2018
comment
Что представляют переменные Education и CoachingCenter? Вы пытались распечатать путь, чтобы убедиться, что он действителен? В том же духе, что такое location и Raius? Без понимания и проверки этой информации мы бы просто угадывали ответ.   -  person Jay    schedule 21.10.2018
comment
Ваше правило безопасности ".read": "auth != null" означает, что пользователь должен пройти аутентификацию, чтобы иметь возможность читать любые данные. Если это не так, вы получите ошибку в onGeoQueryError, которую теперь игнорируете. Реализуйте это как public void onGeoQueryError(DatabaseError error) { throw error.toException(); }, чтобы в этом случае получить более явную ошибку. Также см. stackoverflow.com/questions/37403747/firebase -отказано в доступе/   -  person Frank van Puffelen    schedule 21.10.2018
comment
но пользователь аутентифицирован. и это все еще не дает данных. так как я могу найти решение в этой ситуации   -  person sam    schedule 21.10.2018
comment
@FrankvanPuffelen onKeyEntered не срабатывает, а просто срабатывает onGeoQueryReady, почему??   -  person sam    schedule 22.10.2018
comment
Это означает, что в расположении базы данных, которое вы запрашиваете, нет результатов для диапазона, который вы запрашиваете. Мы не можем сказать, почему это так, потому что мы не знаем значений location и Raius. Попробуйте воспроизвести проблему с жестко закодированными значениями, а затем обновите вопрос с ними.   -  person Frank van Puffelen    schedule 22.10.2018
comment
теперь он работает, я меняю правила безопасности, и теперь он легко получает данные   -  person sam    schedule 23.10.2018


Ответы (1)


После изменения правил безопасности моей базы данных он начинает работать

 {
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "geofire": {
      ".read": "true",
        ".indexOn": ["g"]
      }
    } 
}

теперь он начинает получать данные. :)

person sam    schedule 23.10.2018