Как отсортировать родительский и дочерний элемент CoreData в swift - PullRequest
0 голосов
/ 14 февраля 2020

В моей модели 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 []
    }

Я пробовал код выше, но не получаю вывод.

1 Ответ

0 голосов
/ 16 февраля 2020

Вы не можете так делать - вам не разрешено сортировать отношения Core Data с помощью блоков сортировки. Если вы хотите получить алфавитный порядок, вы можете сделать это с помощью:

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

Если вы хотите sh сделать за один выбор , то вы должны убедиться, что объекты Core Data уже отсортированы, когда вы сохраняете их - используя упорядоченные отношения (вы можете прочитать больше об этом здесь ). Поэтому, когда вы выбираете родительский объект, дочерний объект, связанный с отношением 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

При этом данные будут уже отсортированы в базе данных.

...