Поиск по данным Firebase: iOS, Swift
Я хотел знать, возможно ли это, и как вы можете искать в firebase. Мое приложение имеет текстовое поле, где вы можете заполнить некоторые спецификации, которые будут «сохранены» через массив.
например:
- Firebase с Swift неоднозначное использование функции registerEventType
- Создание 0 байтового файла на Xcode 8.2 вызывает предупреждение «Mach-O: Достигнут конец файла при поиске: uint32_t.»?
- как получить массив данных из firebase
- Firebase Commit / Rollback для сложных операций записи
- Firebase 3.x - Facebook Войти
var arrayOfSpecs = ["13'", "Black"]
Теперь я хочу выполнить поиск с помощью двух сегментированных опций:
-
Найдите имя одной из Elektronics, имеющей спецификацию 13 "или черный" (это электронное устройство может иметь другие спецификации, но должно включать хотя бы одну из данных спецификаций)
-
Найдите имя одной из Elektronics, у которой есть только те спецификации, которые я написал, меньше спецификаций в порядке, но не больше спецификаций, чем там, где искал человек.
Пример : поиск «черного» «13inch»; searchResults может включать в себя macbook с одной спецификацией: «черный», но он также может включать macbook Pro с двумя спецификациями: «черный» и «13inch», но он не может включать macbook Air со спецификациями: «черный», 13 дюймов "," Retina "
SearchResult будет отображаться в виде таблицы или будет хранить правильные имена searchResults в массиве, которые я бы добавил в UITableView
Ниже моей базы данных, я надеюсь, вы поймете, что я ищу.
спасибо
- Где я могу добавить ссылку на базу данных Firebase на iOS?
- Firebase получить данные
- Как получить идентификатор электронной почты из файла JSON в firebase с помощью swift
- Вход в Facebook с Firebase. Не удается найти URI перенаправления URI
- Firestore - Ошибка прослушивателя снимков iOS. Указанная транзакция истекла или больше не действительна
- Аутентификация с помощью секретов базы данных в Firebase SDK v3?
- Добавление нескольких детей в базу данных Firebase с помощью Swift
- Удалить производственные APN
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.