【问题标题】:How to sorting parent and child CoreData element in swift如何在swift中对父子CoreData元素进行排序
【发布时间】:2020-05-30 06:05:32
【问题描述】:

我的 CoreData 模型中有 3 个实体。Category 、Subcategory 、inventory.inventory 连接到子类别和使用关系连接到类别的子类别。所以当我想要获取库存和子类别时,我会使用类别数据。所以我的问题是我想按字母顺序对所有三个实体数据进行排序。

class func getAllCategoriesObject() -> [DBCategories]?
    {
        let context = getContext()

        let fetchRequest:NSFetchRequest<DBCategories> = DBCategories.fetchRequest()
        fetchRequest.returnsObjectsAsFaults = false

        do{
            let fetchedData = try context.fetch(fetchRequest).sorted(by: { (objCategory1, objCategory2) -> Bool in
                (objCategory1.subcategories?.allObjects as? [DBSubCategories] ?? []).sorted { (objSubCategory1, objSubCategory2) -> Bool in

                    (objSubCategory1.inventories?.allObjects as? [DBInventories] ?? []).sorted { (objInventory1, objInventory2) -> Bool in

                        return objInventory1.title?.capitalized ?? "" < objInventory2.title?.capitalized ?? ""
                    }

                    return objSubCategory1.title?.capitalized ?? "" < objSubCategory2.title?.capitalized ?? ""
                }

                return objCategory1.title?.capitalized ?? "" < objCategory2.title?.capitalized ?? ""
            })



            return fetchedData
        }
        catch
        {
            print( error.localizedDescription)
        }
        return []
    }

我试过上面的代码,但没有得到输出。

【问题讨论】:

    标签: ios arrays swift core-data higher-order-functions


    【解决方案1】:

    你不能那样做——你不能用排序块对核心数据关系进行排序。 如果你想实现字母顺序,你可以这样做:

    NSSortDescriptor(key: [KEY NAME], ascending: true, selector: #selector(NSString.caseInsensitiveCompare))
    

    如果您希望一次提取,那么您必须确保在保存 Core Data 对象时已经对其进行了排序 - 通过使用有序关系(您可以阅读更多关于它的信息here )。 因此,当您获取父对象时,与 NSOrderedSet 关系连接的子对象已经按照您的意愿进行了排序。

    只是简单的例子:

    //Create context, create objects in context
    let someChildsObject: [NSManagedObject] = //.. Objects with name property
    someChildsObject.sorted(by: { $0.name > $1.name }) //Sorting according to name value
    parent.children = NSOrderedSet(array: someChildsObject)
    //Save context
    

    通过这样做,数据将已经在数据库中排序。

    【讨论】:

      猜你喜欢
      • 2012-12-26
      • 2014-01-27
      • 2016-03-02
      • 2016-09-25
      • 2018-07-31
      • 1970-01-01
      • 2021-08-12
      • 2014-10-21
      • 2018-07-04
      相关资源
      最近更新 更多