2016-08-19 5 views
1

Я создаю приложение для продажи билетов, используя базу данных Firebase. Вот мой формат базы данных: enter image description hereПредварительный запрос и фильтрация в Firebase с использованием iOS Swift

, если я пишу такой код:

let ref = FIRDatabase.database().reference() 

    ref.child("jadwal") 
     .queryOrderedByChild("tanggal") 
     .queryEqualToValue("17/08/2016") 
     .observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     print(snapshot) 

    }, withCancelBlock: nil) 

выход будет:

Snap (-KPMQefHSuk7j9kb3GTJ) { 
    asal = BNA; 
    harga = 177000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 35; 
    tujuan = BRN; 
} 
Snap (-KPMQnCGrXY36NEMxSOU) { 
    asal = BNA; 
    harga = 150000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 37; 
    tujuan = MDN; 
} 
Snap (-KPMQqFmku_XzItElzjV) { 
    asal = BNA; 
    harga = 160000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 

будет показывать все «tanggal» со ​​значением, равным до «17/08/2016», , когда я это делаю ...

let ref = FIRDatabase.database().reference() 

    ref.child("jadwal") 
     .queryOrderedByChild("harga") 
     .observeEventType(.ChildAdded, withBlock: { (snapshot) in 

     print(snapshot) 

    }, withCancelBlock: nil) 

он будет показывать все «harga» заказал от низкого до высокого, как это:

Snap (-KPNgVeXXnqnzevh5w6u) { 
    asal = BNA; 
    harga = 120000; 
    idBus = id; 
    jam = "22:30"; 
    tanggal = "30/08/2016"; 
    tersedia = 38; 
    tujuan = TKG; 
} 
Snap (-KPMQnCGrXY36NEMxSOU) { 
    asal = BNA; 
    harga = 150000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 37; 
    tujuan = MDN; 
} 
Snap (-KPMQqFmku_XzItElzjV) { 
    asal = BNA; 
    harga = 160000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 
Snap (-KPMQefHSuk7j9kb3GTJ) { 
    asal = BNA; 
    harga = 177000; 
    idBus = id; 
    jam = "20:00"; 
    tanggal = "17/08/2016"; 
    tersedia = 35; 
    tujuan = BRN; 
} 
Snap (-KPNgJPRlEuu0FZvjU2J) { 
    asal = BNA; 
    harga = 180000; 
    idBus = id; 
    jam = "21:30"; 
    tanggal = "25/08/2016"; 
    tersedia = 40; 
    tujuan = MDN; 
} 
Snap (-KPNgQ2qQXQpY4eT2Jqd) { 
    asal = BNA; 
    harga = 230000; 
    idBus = id; 
    jam = "22:30"; 
    tanggal = "30/08/2016"; 
    tersedia = 38; 
    tujuan = BNJ; 
} 

видеть, что «harga» сортируется , но мне нужно, чтобы показать список снимков, которая показывает «harga» сортируется и только «tanggal» - «17/08/2016». Мне всегда не удалось это сделать, и ошибка в основном с «multiple orderBy()», мне нужно запросить и фильтровать данные на основе двух или более дочерних значений. В основном я хочу сортировать на основе «harga», фильтр на основе «tanggal», «asal», «tujuan» и minimun number of «tersedia» Пожалуйста, помогите мне, я хочу переключить свой db с SQL на Firebase. Спасибо.

+0

В запросе Firebase может быть только одно предложение 'orderBy'. Иногда вы можете комбинировать значения, которые вы хотите фильтровать/упорядочивать, в одном свойстве, но это зависит от вашего конкретного варианта использования. См. Http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

ответ

1

В настоящее время нет способа запросить более одного дочернего ключа в Firebase. Я бы предложил два возможных решения:

Первое решение: свести структуру базы данных.

Объяснение: Вместо того, чтобы просто раздел «jadwal» со ​​всеми детьми, реализовать структуру, как это:

jadwal: { 
    "17/08/2016": { 
     harga: 
    }, 
    "17/07/2016": { 
     harga: 
    } 
} 

Затем, вы можете выбрать путь, согласно которому «tanggal» для фильтрации, а затем Сортируйте childen по значению «harga».

Второе решение: Сделайте некоторую фильтрацию на стороне клиента

Объяснение: запросить ли вы в jadwal с помощью OrderBy («harga»), а затем на слушателя ChildAdded на стороне клиента, фильтровать результаты. Это означает, что вы проверили бы, есть ли у ребенка предполагаемый tanggal. Если это так, добавьте его в массив результатов. В противном случае перейдите к следующему ребенку.

Дайте мне знать, если у вас есть еще вопросы.

+0

Не могли бы вы объяснить мне больше о сглаживании моей структуры базы данных? Я еще не понял этого. Благодарю. – chronycles

Смежные вопросы