2015-06-09 70 views
1

所以我有一個運動應用程序,處理比賽和錦標賽數據。 我必須使用相同的數據的兩個顯示器:Firebase:結合過濾和快速排序

  • 今後所有從某一個冠軍

的數據結構是這樣

- championships 
    - libertadores 
     - name: Libertadores da América 
- matches 
    - 2j6g42kjhg62 
     - champ: libertadores 
     - time: 1433962855 
     - <data> //teams, scores, stadium and so on 

現在匹配

  • 所有未來的比賽中,展示未來的匹配很容易:

    matchesRef.queryOrderedByChild("time").queryStartingAtValue(currentTimestamp) 
          .queryLimitedToFirst(20) 
          .observeEventType(.ChildAdded, withBlock: { (snapshot) in 
           // code 
          }) 
    

    但是,因爲你不能使用多個queryOrderedByChild我堅持把這與冠軍的過濾結合起來。

    我想過改變我的數據結構來支持像/championship/matches/<matchID>這樣的事情,但這會讓我很難顯示所有未來的匹配。

    不過濾不是在這裏,所以我怎麼能達到預期的效果?

  • +0

    你可以在代碼中過濾它嗎?我們非常成功地查詢了我們想要的數據組(20個未來比賽),然後通過NSPredicate數組搜索縮小爲一個子集(錦標賽)。這樣做的好處是,如果用戶想要查看一個數據子集(比如說不同的冠軍),那麼您不必再次訪問服務器,只需更改您的NSPredicate搜索條件即可。而且,如果您正在觀察用於添加/編輯/刪除的匹配節點,則您的「主」匹配數組將始終保持最新狀態。 – Jay

    +0

    我們已經考慮過了,但是打到服務器將是我們的第一選擇,因爲我們正在查詢未來的20場比賽,並且當用戶過濾冠軍時,我們希望從該冠軍賽中接下來的20場比賽,而不是說3 .. –

    +0

    唯一的選擇是將想要查詢的值組合到一個屬性中。例如。 ''time_and_champ「:」1433962855_ libertadores「'。在任何地方都不可能,但在可能的情況下,這可能是你最好的選擇。另見http://stackoverflow.com/questions/30654872/how-to-query-based-on-multiple-conditions-in-firebase/30655736#30655736 –

    回答

    3

    Got it!

    我在發佈問題之前已經閱讀過文檔,但沒有將我引向解決方案的點擊。

    的結構數據本節包含了答案:https://www.firebase.com/docs/ios/guide/structuring-data.html

    明白: 自然的結構將是:

    - champs 
        - champID 
         - matches 
          - matchID 
          - <matchData> 
         - champName 
    

    然而,隨着火力的工作,我們需要標準化的數據:

    - champs 
        - champID 
         - champName 
    
    - matches 
        - matchID 
         - champID 
         - timestamp 
         - <matchData> 
    

    這是我開始我的問題的結構。

    但是,由於錦標賽的比賽和比賽屬於錦標賽,我們需要將它們交叉參考。上面鏈接的文檔告訴我們可以給鑰匙價值true,因爲我們對鑰匙的價值不感興趣,只是它存在。但是,因爲我只需要將來的比賽,所以解決方案是將匹配時間戳放入值中。

    - champs 
        - champID 
         - matches 
          - matchID: timestamp 
         - champName 
    - matches 
        - matchID 
         - champID 
         - timestamp 
         - <matchdata> 
    

    現在最終代碼:

    未過濾視圖:

    // Query non-filtered matches Reference 
    matchesRef.queryOrderedByChild("time").queryStartingAtValue(currentTimestamp) 
        .queryLimitedToFirst(20).observeEventType(.ChildAdded, withBlock: { (snapshot) in 
          // code 
        }) 
    

    篩選視圖:

    // Query filtered matches 
    champsRef.childByAppendingPath(champKey).childByAppendingPath("matches") 
        .queryOrderedByValue().queryStartingAtValue(currentTimestamp) 
        .queryLimitedToFirst(20) 
        .observeEventType(.ChildAdded, withBlock: { (snapshot) in 
         let key = snapshot.key 
         matchesRef.childByAppendingPath(key).observeSingleEventOfType(.Value, withBlock: { (matchSnapshot) in 
          // code 
         }) 
        }) 
    
    0

    在火力只能在queryOrderedBy(child: String)鍵過濾器。在我的情況下,我需要篩選多個日期範圍(每個日期範圍是UITableView中的一個部分),並在這些排序中分開一個字段。解決方案是使用FUISortedArray,它需要一個sortDescriptor (DataSnapshot, DataSnapshot) -> ComparisonResult