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

Posted

技术标签:

【中文标题】在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序【英文标题】:Sort CoreData results using NSPredicate in Swift 【发布时间】:2014-10-21 11:03:24 【问题描述】:

我目前正在用 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 - 修改上面的代码以确保“结果”数组正确排序。 2 - 识别随后可应用于结果数组以按任何字段重新排序的代码。

提前致谢!

【问题讨论】:

您查看过NSPredicatesortDescriptors 属性吗? 《Core Data Programming Guide》也有很多例子(Objective-C),见developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…。 sortDescriptors 是 NSFetchRequest 的属性。我不认为 N​​SPredicate 有这样的属性。 @insane-36:你说得对,我的意思是 NSFetchRequest。 【参考方案1】:

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

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

【讨论】:

或者:request.sortDescriptors = [NSSortDescriptor(key: "name_f", ascending: true)] 如果你不喜欢打字!【参考方案2】:

我使用了 Oliver Spencer 的上述答案,因为排序方法包括待处理的更改,而“max”方法不包含这些更改(请参阅 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 )

【讨论】:

以上是关于在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 对表视图中的核心数据进行排序 (Swift)

Swift NSPredicate SUBQUERY with NOT IN?

在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

我如何在单个提取请求中调用两个 NSPredicate。核心数据 iOS Swift

NSPredicate 按名称传递“多个”参数[在 Swift 中]