Сортировать по дате - Swift 3
У меня есть func getData(), который извлекает основной объект данных, и я хочу сортировать их по дате. Как я могу применить NSPredicate или Predicate для получения данных из CoreData, отсортированных по дате?
Мой основной объект данных:
Объект: Расходы
Атрибуты:
- количество
- категория
- дата
func getData() {
let context = appDelegate.persistentContainer.viewContext
do {
expenses = try context.fetch(Expenses.fetchRequest())
} catch {
print("Cannot fetch Expenses")
}
}
Спасибо за помощь!
Ответы
Ответ 1
Предикаты предназначены для фильтрации результатов поиска. Для их сортировки вам необходимо использовать NSSortDescriptor. Предполагая, что у вас есть атрибут для объекта "Расходы", называемого датой типа "Дата":
func getData() {
let context = appDelegate.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<Expenses>(entityName: "Expenses")
let sort = NSSortDescriptor(key: #keyPath(Expenses.date), ascending: true)
fetchRequest.sortDescriptors = [sort]
do {
expenses = try context.fetch(fetchRequest)
} catch {
print("Cannot fetch Expenses")
}
}
EDIT: я должен был упомянуть, что селектор сортировки добавляется в массив, чтобы при необходимости можно было добавить несколько дескрипторов сортировки. например сортировать по дате, затем по количеству ножек, затем по объему и т.д.
Ответ 2
Вам нужен дескриптор сортировки, чтобы получить все объекты в определенном порядке.
let sectionSortDescriptor = NSSortDescriptor(key: "date", ascending: true)
let sortDescriptors = [sectionSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors
Ответ 3
Моя функция для выполнения fetchRequest данных в Core Data и сортировки результатов по дате "timestamp" в порядке убывания. "Ruta" - это имя объекта.
//Array of Ruta entity
rutas = [Ruta]()
func getData() {
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Ruta")
let sort = NSSortDescriptor(key: "timestamp", ascending: false)
request.sortDescriptors = [sort]
do {
rutas = try context.fetch(request) as! [Ruta]
} catch {
print("Fetching Failed")
}
}
Ответ 4
Чтобы получить данные, которые были добавлены в последний раз, необходимо установить ключ дескриптора сортировки как ObjectId.
let sectionSortDescriptor = NSSortDescriptor(key: #keyPath(Entity.ObjectId)
ascending: false) fetchRequest.sortDescriptors = [sectionSortDescriptor]
Ответ 5
В Swift 4 или Swift 5 вы можете использовать как
func sortlist(){
//1
guard let appDelegate =
UIApplication.shared.delegate as? AppDelegate else {
return
}
let managedContext =
appDelegate.persistentContainer.viewContext
//2
let fetchRequest =
NSFetchRequest<NSManagedObject>(entityName: "User")
let sort = NSSortDescriptor(key: "date", ascending: false)
fetchRequest.sortDescriptors = [sort]
//3
do {
let langugeCodes = try managedContext.fetch(fetchRequest)
for result in langugeCodes as [NSManagedObject] {
var username:String = result.value(forKey: "username")! as! String
print("username==>",username)
}
} catch let error as NSError {
print("Could not fetch. \(error), \(error.userInfo)")
}
}