【问题标题】:Sort by date - Swift 3按日期排序 - Swift 3
【发布时间】:2017-02-27 06:47:28
【问题描述】:

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

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

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

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

感谢您的帮助!

【问题讨论】:

  • 查找NSSortDescriptor ...
  • 如果您希望所有数据都以排序形式出现,则不需要谓词。像sortDescriptors = [NSSortDescriptor.init(key: "date" ascending: true)] 这样的东西应该可以工作。

标签: swift core-data


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

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

【讨论】:

  • 这解决了一切,非常感谢。但是这条线在let fetchRequest: NSFetchRequest&lt;Expenses&gt; = Expenses.fetchRequest()不正确应该是let fetchRequest: NSFetchRequest&lt;Expenses&gt;(entityName: "Expenses")
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我的函数在 Core Data 中执行数据的 fetchRequest 并按日期“时间戳”按降序对结果进行排序。 “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】:

      在swift 4或swift 5中,可以使用like

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 我希望它能奏效。我的对象没有我想依赖的属性,所以我寻找核心数据保存顺序来呈现数据,因为它们在我的 json 中排序(因为它们是按照它们在 json 中出现的顺序保存的)。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 2011-02-19
        • 1970-01-01
        • 1970-01-01
        • 2017-07-05
        相关资源
        最近更新 更多