按日期排序 - Swift 3

时间:2017-02-27 06:47:29

标签: swift core-data

我有一个func getData()来检索核心数据实体,我想按日期对它们进行排序。如何应用NSPredicate或Predicate从CoreData获取按日期排序的数据?

我的核心数据实体: 实体:费用 属性: - 金额 - 类别 - 日期

func getData() {
    let context = appDelegate.persistentContainer.viewContext

    do {
        expenses = try context.fetch(Expenses.fetchRequest())
    } catch {
        print("Cannot fetch Expenses")
    }
}

感谢您的帮助!

5 个答案:

答案 0 :(得分:33)

谓词用于过滤搜索结果。要对它们进行排序,您需要使用NSSortDescriptor。假设您的Expenses实体上有一个名为date of date的属性:

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")
    }
}

编辑:我应该提到排序选择器被添加到一个数组中,以便在需要时可以添加多个排序描述符。例如首先按日期排序,然后按腿数排序,然后按体积排序等

答案 1 :(得分:11)

您需要一个排序描述符来按特定顺序获取所有对象。

let sectionSortDescriptor = NSSortDescriptor(key: "date", ascending: true)
let sortDescriptors = [sectionSortDescriptor]
fetchRequest.sortDescriptors = sortDescriptors

答案 2 :(得分:2)

我的功能是在核心数据中执行fetchRequest数据并按日期排序结果&#34; timestamp&#34;按降序排列。 &#34;芸香&#34;是实体的名称。

//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")
        }
    }

答案 3 :(得分:1)

在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)")
    }
}

答案 4 :(得分:0)

要获取首先添加的数据,需要将排序描述符的键设置为ObjectId。

let sectionSortDescriptor = NSSortDescriptor(key: #keyPath(Entity.ObjectId)
ascending: false) fetchRequest.sortDescriptors = [sectionSortDescriptor]