使用Swift中的NSPredicate对CoreData结果进行排序

时间:2014-08-27 18:16:05

标签: arrays search core-data swift nsmanagedobject

我目前正在Swift中编写一个简单的电话簿应用程序,需要对CoreData查询中的结果进行排序。

基本上,我设置了一个名为“Directory”的NSManagedObject,其中包含相应的字段名称,例如: “name_f”是用户的名字。

查询的CoreData数据库中的名称按字母顺序排列。但是,尽管第一次搜索按字母顺序返回结果,但有时不会在程序的其他区域查询数据库之后进一步搜索。我不确定为什么会这样,但是想要放入代码来主动对返回的数组进行排序。

我返回NSManagedObject数组的代码如下:

func SearchName(nameToSearch: String) -> NSArray {
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context:NSManagedObjectContext = appDel.managedObjectContext! //I added the !

    let request = NSFetchRequest(entityName: "Directory")
    request.returnsObjectsAsFaults = false      //will return the instance of the object

    //request.predicate = NSPredicate(format: "name_f = %@", nameToSearch)
    //request.predicate = NSPredicate(format: "name_f MATCHES '.*(\(nameToSearch)).*'")
    request.predicate = NSPredicate(format: "name_f MATCHES[cd] '(\(nameToSearch)).*'")
    var results:NSArray = context.executeFetchRequest(request, error: nil)
    return results
}

顺便说一下,我使用以下代码从返回的结果中提取特定值(其中searchResult是SearchName所在的类的实例):

    var particularEntry = self.searchResult[self.selectedItem] as Directory
    lblDetailName.text = thisPerson.name_f

理想情况下,我希望能够: 1 - 修改上面的代码以确保'results'数组被正确排序。 2 - 识别随后可应用于结果数组的代码,以便按任何字段重新排序。

提前致谢!

2 个答案:

答案 0 :(得分:38)

谢谢 - 在request.predicate行之前需要以下几行:

let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors

答案 1 :(得分:0)

我使用了奥利弗·斯宾塞(Oliver Spencer)的上述答案,因为排序方法包括待处理的更改,而“最大”方法则没有(参见apple documentation on NSFetchRequest)。

为方便起见,这里是我的代码:

func fetch_biggestImageID() -> Int {

    print("Fetching biggest ImageID")
    let request: NSFetchRequest<CD_Image> = CD_Image.fetchRequest()
    request.sortDescriptors = [NSSortDescriptor(key: "id", ascending: false)]
    request.fetchLimit = 1

    var maxValue: Int64? = nil
    do {
        let result = try self.managedObjectContext.fetch(request)
        maxValue = result.first?.id
    } catch {
        fatalError("Unresolved error while retrieving max imageID value \(error)")
    }

    return  Int(truncatingIfNeeded:  maxValue ?? 0 )
}