#firebase #flutter #google-cloud-firestore
#firebase #flutter #google-облако-firestore
Вопрос:
В проекте приложения flutter для электронной коммерции я использую shortInfo
поле моей коллекции товаров в качестве уникального идентификатора для каждого продукта. При нажатии кнопки «Добавить в корзину» сохраняется поле « shortInfo
в массив», вызываемое userCartList
в моей users
коллекции, и я использую Where для запроса этого массива, но когда у меня более 10 продуктов, мое приложение вылетает. Что я здесь делаю не так?
Вот моя структура firestore:
Вот фрагмент запроса, который я делаю:
StreamBuilder<QuerySnapshot>(
stream: EcommerceApp.firestore
.collection("items")
.where("shortInfo", whereIn: EcommerceApp.sharedPreferences.getStringList(EcommerceApp.userCartList))
.snapshots()
)
Комментарии:
1. Не могли бы вы предоставить фрагменты кода, которые вызывают ошибку?
2. StreamBuilder<QuerySnapshot>( //ЗАДАЧА: исправить проблему stream: EcommerceApp.firestore .collection(«items») .где(«shortInfo», где: EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList)) .snapshots(),
3. Этот код дает требуемый результат, но когда в соответствии с правилом firebase добавляется более 10 продуктов, этот запрос mothod не допускает более 10, что и вызывает ошибку. Список пользовательских корзин — это список, сохраненный в общих настройках, которые я извлекаю из firebase
Ответ №1:
Проблема здесь в том, что Firestore не позволяет вам выполнять запрос на членство в массиве с более чем 10 записями. Если вы проверите эту документацию, вы увидите, что:
Используйте
in
оператор для объединения до 10 предложений равенства (==) в одном поле с логическим ИЛИ
За кулисами ваш whereIn
оператор выполняет тот же запрос, который показан в примере в документации, и если вы используете более 10 записей, Firestore не примет его, и вы получите сообщение об ошибке. Я предлагаю вам разбить EcommerceApp.userCartList
массив на несколько массивов максимум с 10 записями для выполнения запроса, это позволит Firestore работать в whereIn
пределах своих возможностей, и это будет работать.
Дайте мне знать, если у вас возникнут еще какие-либо вопросы по этому вопросу.
Комментарии:
1. Я смог исправить эту проблему с помощью следующего кода: for (int i = 1; i < EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList) .length; i ) StreamBuilder<QuerySnapshot>( поток: EcommerceApp.firestore .collection(«items») .where(«shortInfo», равнозначно: EcommerceApp.SharedPreferences .getStringList(EcommerceApp.userCartList)[i]) .снимки (),