排序核心数据获取(swift 4)

Posted

技术标签:

【中文标题】排序核心数据获取(swift 4)【英文标题】:sort coreData fetch (swift4) 【发布时间】:2017-11-28 20:47:26 【问题描述】:

现在我的代码使用 NSPredicate 或排序描述符基本上只是收集一个名称。我希望 NSPredicate 从 a-z 中对所有名称进行排序。

核心数据处理程序

class coreDataHandler: NSObject 

private class func getContext() -> NSManagedObjectContext

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext

class func saveObject(username:String, password:String) -> Bool
 let context = getContext()
    let entity = NSEntityDescription.entity(forEntityName: "User", in: context)
    let managedObject = NSManagedObject(entity: entity!, insertInto: context)

    managedObject.setValue(username, forKey: "username")
  managedObject.setValue(password, forKey: "password")
    do 
        try context.save()
        return true
     catch 
        return false



    
 class func filterData() -> [User]? 
    let conttext = getContext()
    let fetchRequest:NSFetchRequest<User> = User.fetchRequest()

    var user:[User]? = nil

    var predicate = NSPredicate(format: "username contains[d] %@" ,"duke")

    fetchRequest.predicate = predicate
    do 
        user = try conttext.fetch(fetchRequest)
        return user
    catch 
        return user
    

视图控制器

  user = coreDataHandler.filterData()
    for i in user! 
        print("Judou : \(i.username!)")
    

【问题讨论】:

NSPredicates 用于过滤数据 - 使用 NSSortDescriptors 对结果进行排序,例如。 fetch.sortDescriptors = [NSSortDescriptor(key:”username”, ascending:true)] @pbasdf 我会把它放到 NSObject 或 viewController 中吗? 您可以在获取时指定排序描述符(这可能是最好的),也可以使用它们对获取返回的数组进行排序。我推荐第一个,所以代码会放在你的 CoreDataHandler 中。 @pbasdf 我添加了更多代码。您能否向我展示我添加的关于如何使用 sortDescriptors 的代码。非常感谢。 【参考方案1】:

如果您希望您的user 数组先按username 排序,然后再按password,我会在您的CoreDataHandler 类中添加一个类函数来获得排序后的数组:

class func getSortedData() -> [User]? 
    let conttext = getContext()
    let fetchRequest:NSFetchRequest<User> = User.fetchRequest()

    var user:[User]? = nil

    var nameSort = NSSortDescriptor(key:"username", ascending:true)            
    var passwordSort = NSSortDescriptor(key:"password", ascending:false) 

    fetchRequest.sortDescriptors = [nameSort, passwordSort]
    do 
        user = try conttext.fetch(fetchRequest)
        return user
     catch 
        return user
    

然后在您的视图控制器中,使用这个新函数来获取排序后的数组:

user = coreDataHandler.getSortedData()
for i in user! 
    print("Judou : \(i.username!), Password:\(i.password)")

【讨论】:

如何先按升序对用户名进行排序,然后按降序对密码进行排序。例如用户名:ben,密码:b,用户名:Ben,密码a。正在尝试打印 ben、a 和 ben b。 你可以指定几个排序描述符,按顺序使用——我会更新我的答案。【参考方案2】:

在 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: "username", 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
            var   password:String = result.value(forKey: "password")! as! String

            print("username==>",username)
            print("name==>",name)

        


     catch let error as NSError 
        print("Could not fetch. \(error), \(error.userInfo)")
    

【讨论】:

以上是关于排序核心数据获取(swift 4)的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSFetchedResultsController 核心数据重新排序 TableView 单元格 - Swift 3

从核心数据中按日期对 TableView 进行排序 - Swift4

Swift Core 数据按天获取结果并排序到带有时间段的表格视图中

如何在swift 4中重新排序单元格后保存tableView顺序

Swift - 按部分对核心数据进行排序

在 Swift 中自动重新排序核心数据