在 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 - 识别随后可应用于结果数组以按任何字段重新排序的代码。
提前致谢!
【问题讨论】:
您查看过NSPredicate
的sortDescriptors
属性吗? 《Core Data Programming Guide》也有很多例子(Objective-C),见developer.apple.com/library/mac/documentation/Cocoa/Conceptual/…。
sortDescriptors 是 NSFetchRequest 的属性。我不认为 NSPredicate 有这样的属性。
@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 中搜索多个单词