Мне нужно получить только те сообщества, где в списке городов они совпадают с конкретным идентификатором местоположения
К сожалению, вы не можете добиться этого, используя свою фактическую структуру базы данных.
Это прекрасно работает, когда дочернее местоположение не является «массивом».
Это работает, когда местоположение является свойством типа String, а не массива, потому что тип объектачто вы можете передать методу equalsTo()
типа String, а не массива.
Так есть ли способ сделать это?
Чтобы справиться с этим, выдолжны дублировать ваши данные.Эта практика называется denormalization
и является обычной практикой, когда дело доходит до Firebase.Если вы новичок в базах данных NoQSL, я рекомендую вам посмотреть это видео: Нормальная нормализация с базой данных Firebase для лучшего понимания.
Кроме того, когда вы дублируете данные, есть одинвещь, которую нужно иметь в виду.Точно так же, как вы добавляете данные, вы должны поддерживать их.Другими словами, если вы хотите обновить / обнаружить элемент, вы должны делать это в каждом месте, где он существует.
При этом, в вашем конкретном случае, вы должны рассмотреть возможность расширения структуры данных, чтобыобратный поиск путем создания другого узла с именем comunityCities
, где вы должны добавить в качестве объектов все соответствующие сообщества.Таким образом, ваша структура базы данных должна выглядеть примерно так:
Firebase-root
|
--- comunityCities
|
--- locationID
|
--- communityID
| |
| --- //Community details
|
--- communityID
|
--- //Community details
Используя эту схему, вы можете просто запросить базу данных, чтобы получить все сообщества, которые соответствуют одному местоположению, используя следующие строки кода:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference comunityCitiesRef = rootRef.child("comunityCities");
comunityCitiesRef.addListenerForSingleValueEvent(/* ... */);
Вы можете прочитать больше информации в моем ответе из следующего поста:
Это ответ на вопрос Cloud Firestore, но те же правила применяются в случае базы данных Firebase в реальном времени.
Или мне просто нужно собрать все сообщества, а затем отфильтровать устройство?
В этом нет необходимости.Используя это решение, вы получите только нужные элементы.