【问题标题】:Sort CoreData results using NSPredicate in Swift在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序
【发布时间】: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。

标签: arrays search core-data swift nsmanagedobject


【解决方案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 )
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多