2016-08-19 9 views
1

Firebase Databaseを使用してチケットを発行するアプリケーションを構築しています。iOS Swiftを使用したFirebaseでの高度なクエリとフィルタリング

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」と表示されます私はこのようなコードを書く場合 enter image description here

:ここに私のデータベース形式です「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()"を使ってこのエラーやエラーに失敗しました。私は2つ以上の子値に基づいてデータをクエリしてフィルタリングする必要があります。基本的には、 "harga"に基づいてソートし、 "tanggal"、 "asal"、 "tujuan"、および "tersedia"の最小数に基づいてフィルタリングしたい。 SQLをFirebaseに切り替える手助けをしてください。ありがとうございました。

+0

Firebaseクエリでは、1つの 'orderBy'句しか指定できません。場合によっては、1つのプロパティでフィルタリング/オーダーする値を組み合わせることもできますが、それは正確なユースケースに依存します。 http://stackoverflow.com/questions/26700924/query-based-on-multiple-where-clauses-in-firebase –

答えて

1

現在、Firebaseの複数の子キーで照会する方法はありません。私はこれに2つの潜在的な解決策を提案します:

最初の解決策:データベース構造を平坦化します。

説明:そして、あなたがすることによってフィルタリングする「tanggal」それによれば、パスを選択することができ、その後

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

:代わりに、すべての子供を持つだけで「jadwal」セクションのは、このような構造を実装しますchildenを "harga"値でソートします。

第二ソリューション:クライアント側で

説明をいくつかのフィルタリングを行います。あなたはORDERBY(「harga」)を使用してjadwalに問い合わせるか、クライアント側のchildAddedリスナーに、結果をフィルタリングします。これは、子供が目的のタンガルを持っているかどうかを確認することを意味します。存在する場合は、results配列に追加します。それ以外の場合は、次の子に移動します。

ご質問がある場合はお知らせください。

+0

私のデータベース構造のフラット化についてもっと教えてください。私はまだそれを把握していない。ありがとう。 – chronycles

関連する問題