2015-09-27 75 views
4

我有領域數據庫,其中包含數據和添加此數據的日期。我想解釋這一點,並設置日期作爲表視圖節標題和數據作爲每個部分的行數據取決於日期。我知道如何提取,但不知道如何按日期進行分組,並根據日期設置每個部分的數據。謝謝!iOS按領域按日期分組查看部分

回答

-8

您可以使用CoreData作爲替代領域,並使用讀取的結果控制,使您可以通過一些變種的數據和組排序。

+4

這是如何被接受的答案?問題是如何在Realm中實現這一點... – SiPe

3

您可以按日期對檢索到的Results進行排序,然後在迭代時對它們進行拆分,以便按照分組/層次的方式對其進行訪問。

class Person { 
    dynamic var name = "" 
    dynamic var date = NSDate() 
} 

let sortedObjects = realm.objects(Person).sorted("date") 

var lastDate = objects.first?.date 
let calendar = NSCalendar.currentCalendar() 
var lastGroup = [Person]() 
var groups = [[Person]]() 

for element in sortedObjects { 
    let currentDate = element.date 
    let difference = calendar.components([.Year, .Month, .Day], fromDate: lastDate!, toDate: currentDate, options: []) 
    if difference.year > 0 || difference.month > 0 || difference.day > 0 { 
     lastDate = currentDate 
     groups.append(lastGroup) 
     lastGroup = [element] 
    } else { 
     lastGroup.append(element) 
    } 
} 
groups.append(lastGroup) 

注:這樣一來,你就需要保持在內存中所有的元素。如果不適合你,根據你的使用情況,你可以只記住索引,而你可以使用它來訪問檢索到的Results中的元素。

0

如果有人與雨燕3.0語法戰鬥:

var lastDate = dateObjects.first?.start 
    let calendar = Calendar.current 
    var lastGroup = [DateObject]() 
    var days = [[DateObject]]() 

    for dateObject in dateObjects { 
     let currentDate = dateObject.start 
     let unitFlags : Set<Calendar.Component> = [.era, .day, .month, .year, .timeZone] 
     let difference = calendar.dateComponents(unitFlags, from: lastDate!, to: currentDate) 

     if difference.year! > 0 || difference.month! > 0 || difference.day! > 0 { 
      lastDate = currentDate 
      days.append(lastGroup) 
      lastGroup = [travelTime] 
     } else { 
      lastGroup.append(dateObject) 
     } 
    } 
    days.append(lastGroup) 
1

我有完全相同的問題,我需要在一個分區表中顯示一種Realm實體,按日期分組,這就是我如何做到的。

包含日期字段

Example類:

final class Appointment: Object { 
    @objc dynamic var id: Int = 0 
    @objc dynamic var date: Date? 
} 

示例代碼,將得到所有的對象和他們的部分/結果拆分,通過獨特的日期分組:

// (un)safely get an instance of Realm 
let realm = try! Realm() 

// get all the dates 
// note that begginingOfDay is a extension on Date 
// which gives back the beggining of the day of the given Date as a Date 
// we are doing this in order to filter out non-unique dates later 
let dates = self.realm.objects(Appointment.self).toArray().flatMap({ $0.date ?? nil }).map({ $0.beginningOfDay() }) 

// cast it to a Set to make values unique, and back to an Array for further use 
let uniqueDates = Array(Set(dates)) 

let predicates = uniqueDates.map({ date -> NSPredicate in 

    // in order to use Swift's Date with NSPredicate 
    // it must be casted to NSDate 
    let begginingOfDay = date.beginningOfDay() as NSDate 
    let endOfDay = date.endOfDay() as NSDate 

    // create a predicate that checks if the given Date is in between 
    // the beggining of a given Date and the end of the given Date 
    let predicate = NSPredicate(format: "(date >= %@) AND (date <= %@)", begginingOfDay, endOfDay) 

    return predicate 
}) 

// create an array of Results<Appointment>, and then use it to drive your table/collection view 
// I will leave this part to you, depends on your UI implementation 
// personally, I wrap this into another object that contains results, section index, section title, etc. 
// and then I use all of that in my table view's data source methods   
let sectionedResults: [Results<Appointment>] = predicates.map({ predicate -> Results<Appointment> in 
    let results = realm.objects(Appointment.self).filter(predicate) 
    return results 
}) 

您現在應該有一個粗略的想法如何做到這一點,我將把UI實現的細節留給你。