2016-09-14 5 views
4

Я хотел узнать, возможно ли это, и как вы можете искать в firebase. Мое приложение имеет текстовое поле, где вы можете заполнить некоторые спецификации, что это получить "спасется через массив ..Поиск по данным о бомбе: iOS, Swift

, например:

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

Теперь я хочу найти 2 сегментированных вариантов:

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

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

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

SEARCHRESULT бы прийти в Tableview, или будет хранить правильные имена SearchResults в массиве, которым я бы поставил в UITableView

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

ТНХ

enter image description here

ответ

2

Изменить ваш 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 за один раз

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

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 i.e 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) 

      } 
     }) 
+0

Под этим я исправил его, поэтому я могу искать по спецификации. Но это ищет через каждый продукт и показывает ключ каждого продукта, когда он имеет по крайней мере одну спецификацию поиска в своих спецификациях. но теперь я хочу искать только продукт, у которого есть мои поисковые спецификации или меньше. как -> iPhone, «черный» = true, «сетчатка» = true, я ищу черную сетчатку и 5 дюймов. iphone приходит .. я ищу черную .. ничего не приходит, потому что у iphone есть спецификация дополнительно .. ты знаешь, как я могу это исправить или я задаю новый вопрос о стеке? –

+0

@ комментарий adams.s на самом деле не место для продления вашего вопроса, если у вас есть, спросите их как свежие, у SO нет никаких ограничений на нет. Q вы публикуете :) И будьте немного более ясны в том, к чему вы стремитесь, поскольку проблемы сортировки и фильтрации уже искажены, чтобы понять. :) – Dravidian

0

Так начать с узлом продуктов для всех продуктов. Имя узла создается с помощью 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" MACS, observeSingleEventOfType из .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.

Вы можете также запросить для всех продуктов, которые StartsWith: 13_ и EndsWith: 13_

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

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

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

0

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