Ответ 1
Спасибо - Следующие строки были необходимы до строки request.predicate:
let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
В настоящее время я пишу простое приложение для телефонной книги в Swift и вам нужно сортировать результаты из запроса CoreData.
В принципе, я создал объект NSManagedObject под названием "Directory" с соответствующими именами полей, например. "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 - Определите код, который впоследствии может быть применен к массиву результатов для повторной сортировки по любому полю.
Спасибо заранее!
Спасибо - Следующие строки были необходимы до строки request.predicate:
let sortDescriptor = NSSortDescriptor(key: "name_f", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors
Я использовал приведенный выше ответ от Оливера Спенсера, потому что подход к сортировке включает ожидающие изменения, которые не подходят для "максимального" подхода (см. яблочную документацию по 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 )
}