2017-03-13 21 views
2

日付で取得したデータをソートしようとしていますが、動作していません。 これは私がソートするデータである。Firebaseは日付でデータを並べ替えます

{ 
"events": { 
    "Saturday, May 6, 2016" : [ null, { 
    "Id" : 3, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 4, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ], 
    "Saturday, April 8, 2016" : [ null, { 
    "Id" : 1, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 2, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ] 
} 
} 

私は彼らが日付順たいが、問題は日付がアイテムのリストのキーであることです。 どうすればいいですか?

私はこれを試してみたが、それは動作していない:

ref.child("events").queryOrderedByKey().observeSingleEvent(of: .value, with: { (snapshot) in 
    let results = snapshot.value as! [String: Any] 
     for (eventDate, arr) in results { 
      let eventsDate = EventsDate() 
      eventsDate.eventsDate = eventDate 
      print(eventDate) 
     } 
}) 

おかげ

+0

FirebaseがあなたのためにIDを作成するようにしてください。それらはデータが作成された時刻を使って生成され、自動的にデータをソートします – Starlord

+0

'queryOrderedByKey()'にキーを提供する必要はありませんか? –

+0

*コールバック内で*あなたは何をしますか?スナップショットを辞書に変換している可能性は非常に高いです(辞書が本質的に順序付けされていないため)。正しい/キー順で項目を確実に取得するには、 'snapshot.children'を繰り返してください。 –

答えて

2

あなたのデータは、キー(日付)でソートされているが、問題は、あなたのキーは文字列であり、文字列はアルファベット順にソートされているということです。したがって、Fの休暇を最初に取得し、次にMをオンデートするようになります。

を時系列的ににソートするには、日付を昇順の数字、つまりタイムスタンプで表す形式を使用する必要があります。 Firebaseはtimestampsをデータベースに書き込むときに標準フォーマットで自動入力するための便利なショートカットを持っていますが、残念ながらデータがで作成された時間が必要なときにのみ適用されます。しかし、任意の日付と時刻のタイムスタンプを生成することは難しくありません。UIで好きなように人間が読める形式に変換するライブラリがたくさんあります。日付でのみ興味があるなら、あなたはおそらくISO-8601のような単純なソート可能な形式で逃げることができます。

{ 
"events": { 
    "2016-05-06" : [ null, { 
    "Id" : 3, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 4, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ], 
    "2016-04-08" : [ null, { 
    "Id" : 1, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    }, { 
    "Id" : 2, 
    "LogoImage" : "image_url", 
    "MainImage" : "image_url", 
    "Name" : "event_name" 
    } ] 
} 
} 

それはあなたがデータでarraysでやっていることも非常に得策だが、それはです別のトピックについては

+0

ありがとう、私はそれを試し、結果についてあなたに知らせるでしょう。データの配列に何が間違っているのか教えてください。ありがとうございます –

+0

配列は整数ベースのマップに変換され、データが更新されるとインデックスの整合性を保つのが難しいため、非常に特殊な場合を除いてFirebaseでは一般的に悪い考えです。プッシュID、優先度、ソートなどは、リンク先の記事で説明したように、他の意味のある値で並べ替えることをお勧めします。私はあなたのアプリについてもっと知らないと具体的な助言をすることはできませんが、(あなたのデータを非正規化する)必要があるかもしれません(https://firebase.google.com/docs/database/ios/structure-data#flatten_data_structures)あなたが作る必要がある質問をよりよくサポートします。 –

0

Firebaseは、独自のキー(それはあなたのために生成UID)を持ち、orderedBy_クエリで、デフォルトでは、これらの優先順位を付けます。これらのデフォルトキーは、追加された日時によって優先順位が付けられます。

あなたが(おそらく)望むのは、「子供」によって注文することです。これは本質的に独自のキーです。以下を試してください:

ref.queryOrdered(byChild: "Id") 

または好きな子供キーある

+0

これはIDで分類されています。これはイベントが発生した日付であるため、イベントがデータベースに追加された日ではありません。 –

+0

データベースの「日付」は「子」キーですか?そうであれば、同じロジックが適用されます。 IDの代わりに日付を使用します。 "date"(firebase.comのデータベースを参照)に対応するデータベース内の子キーを探し、上記のコードを使用してそのキーを適用します。 – Oprimus

関連する問題