Поиск по данным Firebase: iOS, Swift

Я хотел знать, возможно ли это, и как вы можете искать в firebase. Мое приложение имеет текстовое поле, где вы можете заполнить некоторые спецификации, которые будут «сохранены» через массив.

например:

var arrayOfSpecs = ["13'", "Black"] 

Теперь я хочу выполнить поиск с помощью двух сегментированных опций:

  • Найдите имя одной из Elektronics, имеющей спецификацию 13 "или черный" (это электронное устройство может иметь другие спецификации, но должно включать хотя бы одну из данных спецификаций)

  • Найдите имя одной из Elektronics, у которой есть только те спецификации, которые я написал, меньше спецификаций в порядке, но не больше спецификаций, чем там, где искал человек.

Пример : поиск «черного» «13inch»; searchResults может включать в себя macbook с одной спецификацией: «черный», но он также может включать macbook Pro с двумя спецификациями: «черный» и «13inch», но он не может включать macbook Air со спецификациями: «черный», 13 дюймов "," Retina "

SearchResult будет отображаться в виде таблицы или будет хранить правильные имена searchResults в массиве, которые я бы добавил в UITableView

Ниже моей базы данных, я надеюсь, вы поймете, что я ищу.

спасибо

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

3 Solutions collect form web for “Поиск по данным Firebase: iOS, Swift”

Измените структуру JSON на

  Electroniks:{ Macbook:{.., Specification:{ 13inch : true, black : true }, ... }, iPhone:{.., Specification:{ 13inch : true, black : true, camera : true }, ... }, iPad:{.., Specification:{ xinch : true, red : true, camera : true }, ... } } 

Я не думаю, что вы можете .queryEqualToValue два узла запросов сразу, но то, что вы можете, вы можете сопоставить одну спецификацию .queryEqualToValue за раз

Таким обходным путем было бы: – получить все родительскиеNodes, которые имеют одну конкретную спецификацию, а затем перебрать их в соответствии с другой спецификацией

  let parentRef = FIRDatabase.database().reference().child("Elektronics") parentRef.queryOrderedByChild("Specification/black").queryEqualToValue(true).observeSingleEventOfType(.Value, withBlock: {(snap) in if let dict = snap.value as? [String:AnyObject]{ for each in dict{ print(each.0) //Would retrieve you every product name with colour black in specification ie Macbook and iPhone print((each.1["Specification"] as! NSDictionary).count)//Number of specification parentRef.child("each.0").child("Specification").child("13inch").observeSingleEventOfType(.Value, withBlock: {(snapshot) in if snapshot.exists(){ print(each.0) //You found your product's with exactly 13inch and black Specification.This is their name } }) } }else{ print(snap.ref) } }) 

Поэтому начните с узла продуктов для всех продуктов. Имя узла создается с помощью childByAutoId.

 products -abcde name: MacBook color: black display: retina port: Thunderbolt size: 13 -fghij name: MacBook Air color: black display: standard port: USB size: 13 -xxxxx name... etc etc 

Затем мы делим спецификации и возвращаемся к продуктам в каждом узле.

 specs black 13 abcde: true fghij: true 15 xxxx: true grey 13 yyyy: true zzzz: true 15 qqqq: true 13 abcde: true fghij: true yyyy: true zzzz: true 

Если вы хотите, чтобы все черные, 13 "Mac, наблюдалиSingleEventOfType of .Value на

 specs/black/13 

узел, который будет загружаться в abcde и fghij ссылки на продукт.

Если вы хотите получить все серые 15-дюймовые ноутбуки, сделайте то же самое на

 specs/grey/15 

узел.

Если вы хотите, чтобы все 13-дюймовые ноутбуки соблюдали

 specs/13 

узел

Красота этого не требует никаких запросов, поскольку вы точно знаете, какие данные вы используете. Запросы очень тяжелые по сравнению с событием наблюдения.

Другим вариантом является компиляция спецификаций в отдельные строки

 specs -abcde black_13_retina_SSD_Thunderbolt 13_retina_SSD_Thunderbolt retina_SSD_Thunderbolt SSD_Thunderbolt Thunderbolt . . -fgijk black_13_standard_SSD_USB 13_standard_SSD_USB etc 

Затем вы можете легко запросить все модели с SSD_Thunderbolt.

Вы также можете запросить все продукты, которые запускаются с: 13_ и заканчиваетсяС: 13_

Вам нужно будет поместить различные комбинации в каждую спецификацию, чтобы вы могли запросить 13_SSD, но если у вас есть только 3 или 4 спецификации, это не так уж плохо.

Помните: дисковое пространство дешево и не бойтесь дублировать данные в разных форматах, чтобы вернуть то, что вы хотите. Кроме того, создание парсера для чтения основного продукта, его анализ и сброс спецификаций в их комбинациях довольно просты.

Надеюсь, это поможет.

Вы также можете использовать SQL-решение вместо Key-Value. Firebase – это база данных Key-Value.

  • FIRInstanceID / WARNING STOP !! Сбросит идентификатор устройства из памяти
  • Firebase Cloud Messaging iOS: нет фонового push-уведомления
  • Firebase withCompletionBlock не вызывается, если нет соединения
  • Я вижу покупки в приложении в Firebase, но я не вижу их в iTunes connect / AppAnnie
  • Можно ли отправлять PushNotifications, используя Firebase Cloud Messaging (FCM) в специальный UDID, непосредственно с устройства?
  • Firebase Facebook зарегистрируйтесь, если пользователь существует
  • Persist Firebase анонимный вход на iOS
  • Firebase Cloud Messaging не работает для пользовательского сегмента с консоли firebase - iOS
  • Логика приложений чата с Swift и Firebase
  • Firebase query - поиск элемента с дочерним элементом, содержащим строку
  • UITableView переадресации вверх
  • Interesting Posts

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

    Как использовать GTMAppAuth в Swift

    Предотвратить segue в методе prepareForSegue?

    Какова последняя функция жизненного цикла приложения iPhone

    Добавление пользовательских обложек альбомов на lockscreen устройств iOS

    Просмотр должен отображаться только в режиме потайт

    Как я могу предотвратить сброс приложений iOS после изменения разрешения камеры?

    Есть ли в магазине приложений iPhone 5 пользователей меньше скриншотов, и наоборот?

    Отображение групп маркеров в Google Map для iOS

    Процесс имеет активные утверждения за пределами допустимого времени iOS

    IOS: NSMutableArray initWithCapacity

    Простое обслуживание в Swift, сохраняется, только переднем плане?

    Разный пользовательский контроллер View для iOS splitViewcontroller

    Является ли PhoneGap на iOS жестко закодированным для загрузки www / index.html?

    iOS Background Transfer – папка com.apple.nsurlsessiond, полная файлов tmp

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.