基于有序多对多关系对描述符进行排序

时间:2016-02-05 11:00:01

标签: ios objective-c swift core-data

我的核心数据模型说明:

  • 项目和问题实体
  • 项目有一个订购的一对多关系来解决问题
  • 问题与名为parentProject的项目
  • 具有一对一的关系

以下是我获取问题的代码:

let fetchRequest = NSFetchRequest(entityName: "Issue")
    fetchRequest.predicate = NSPredicate(format: "parentProject CONTAINS[cd] %@", argumentArray: [project])
    fetchRequest.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]

    let frc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: dataManager.context,
        sectionNameKeyPath: nil,
        cacheName: nil)

    return arc

即使我有项目对象的所有问题,我更喜欢使用获取结果控制器获取问题,因此它们将始终更新,我喜欢与表的集成。在使用FRC显示项目之前,我也喜欢导航控制器屏幕。

正如您在代码中看到的那样,问题按名称参数排序。

但是我希望按照我将它们保存在项目的NSMutableOrderedSet中的顺序对它们进行排序。

AFAIK当它用于核心数据时,我不能将NSSortDescriptor与比较器/选择器一起使用。

你知道怎么做吗?提前谢谢。

4 个答案:

答案 0 :(得分:2)

如果您使用关系密钥路径(在您的情况下为parentProject),它将根据有序集进行排序。所以你可以使用

fetchRequest.sortDescriptors = [NSSortDescriptor(key: "parentProject.name", ascending: true),NSSortDescriptor(key: "parentProject", ascending: true)]

首先按项目对它们进行排序,然后在每个项目组中按照与关系中有序集相同的顺序对其进行排序。您可以选择使用sectionNameKeyPath将每个问题的项目放在不同的部分。

如果你不首先使用parentProject.name(或类似的东西 - 比如parentProject.lastUpdated)那么它们只能按照orderedSet的顺序排序。换句话说,它将是所有第一个问题,然后是所有第二个问题等。这可能不是你想要的。

答案 1 :(得分:1)

这可能是一个混乱,但无论如何。在我看来,你的第一次提取是一个过滤器..例如,向我展示这个项目的问题。也许你可以在选定的问题上执行第二次获取,这次不过滤它们,而是对它们进行排序?

关于CoreData,我有一个这样的排序提取:

  func fetchItem() {
        print(#function)

        let sortDescriptor: NSSortDescriptor!
        let defaults: UserDefaults = UserDefaults.standard
        if defaults.integer(forKey: "sequenceSwitchValue") == 0 {
            sortDescriptor = NSSortDescriptor(key: "itemName", ascending: true, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
        } else {
            sortDescriptor = NSSortDescriptor(key: "itemName", ascending: false, selector: #selector(NSString.localizedCaseInsensitiveCompare(_:)))
        }

        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: itemEntity)
        request.sortDescriptors = [sortDescriptor]
        let predicate: NSPredicate = NSPredicate(format: "itemName == %@", incomingItemName)
        request.predicate = predicate


        do {
            items = try context.fetch(request) as! [ItemEntity]
        } catch let error as NSError {
            print("Error While Fetching Data From DB: \(error.userInfo)")
        }

        if items.count > 0 {
            let currentItem = items[0]

您可以将关系值用于谓词..

答案 2 :(得分:1)

你可能不想听到这个,但不幸的是,你不能。 NSFetchedResultsController无法使用sortDescriptors基于有序的一对多关系进行排序。您应该向Apple提交错误。您应该抛弃NSFetchedResultsController并自己处理它的委托方法。

答案 3 :(得分:-2)

保持秩序的最简单方法是为&#34;问题添加属性&#34;实体。名为position的{​​{1}}类型的Int。并使用排序描述符,它将按此position属性

对实体进行排序