代码之家  ›  专栏  ›  技术社区  ›  Jigar

如何在swift中对父和子CoreData元素进行排序

  •  0
  • Jigar  · 技术社区  · 6 年前

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

    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 []
        }
    

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

    0 回复  |  直到 6 年前
        1
  •  0
  •   Tziki    6 年前

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

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

    如果你想一次完成 然后,您必须确保在保存核心数据对象时已经对它们进行了排序——使用有序关系(您可以阅读更多关于它的信息) here ). 因此,当您获取父对象时,与SensorDeredSet关系连接的子对象已经按照您的意愿进行了排序。

    举个简单的例子:

    //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
    

    这样,数据就已经在数据库中进行了排序。