在Swift核心数据中对存储的数据模型提取进行排序

时间:2017-12-06 06:21:13

标签: swift xcode core-data

在核心数据中,可以使用Xcode将查询保存为数据模型中的获取请求。模型中似乎没有任何方法可以为结果设置排序顺序。更糟糕的是,如果您稍后尝试在代码中添加排序:

fetchRequest.sortDescriptors = [ NSSortDescriptor( key: #keyPath(Venue.name), ascending: true) ]

运行时将抛出错误

  

无法修改不可变模型中的命名提取请求。

表明因为fetch是在模型中定义的,所以它现在只能读取。

这是否有效地意味着如果您需要排序结果集,则无法将获取请求存储在模型中?

[请注意,我一般不会询问如何对提取进行排序,但前提是可以在模型中存储 已排序 提取或稍后添加排序]

2 个答案:

答案 0 :(得分:1)

我刚刚遇到了同样的问题。 答案在于苹果自己的documentation

  

但是,一旦使用了模型,就不得更改它。这是在运行时强制执行的-当对象管理器首先使用模型获取数据时,整个模型将变得不可编辑。在此之后进行的任何对模型或其子对象进行变异的尝试都将引发异常。如果需要修改正在使用的模型,请创建一个副本,修改该副本,然后丢弃具有旧模型的对象。

要对从Xcode提取的请求进行排序,请使用

func fetchRequestFromTemplate(withName name: String, substitutionVariables variables: [String : Any]) -> NSFetchRequest<NSFetchRequestResult>?

而是返回获取请求模板的副本。

我的这段代码似乎可行(到目前为止):

 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
        return
    }

    let managedContext = appDelegate.persistentContainer.viewContext
    let mom: NSManagedObjectModel = appDelegate.persistentContainer.managedObjectModel
    let filteredFetchRequest = mom.fetchRequestFromTemplate(withName: "SetsWithNotes", substitutionVariables: ["notes" : (Any).self])
    let sort = NSSortDescriptor(key: #keyPath(MaxRepSet.date), ascending: false)
    filteredFetchRequest!.sortDescriptors = [sort]
    do {
        maxRepSetList = try managedContext.fetch(filteredFetchRequest!) as! [MaxRepSet]
        print(maxRepSetList.count)
    } catch let error as NSError {
        print("Could not fetch. \(error), \(error.userInfo)")
    }

答案 1 :(得分:0)

我建议这样:

1-将模型存储在核心数据中

2-获取数据,然后根据您要排序的属性将其排序到新数组中

3-创建新模型并在此模型中保存新的排序数组,现在您可以将其存储在任何地方,

如果要将其存储在userDefaults中,则需要对模型进行编码和解码

4-删除最旧的模型

祝你好运