排序核心数据获取(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 数据按天获取结果并排序到带有时间段的表格视图中