![](/img/trans.png)
[英]swift CoreData predicates to filter all the child data of a given parent
[英]How to sorting parent and child CoreData element in swift
我的 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 []
}
我試過上面的代碼但沒有得到輸出。
你不能那樣做——你不能用排序塊對核心數據關系進行排序。 如果你想實現字母順序,你可以這樣做:
NSSortDescriptor(key: [KEY NAME], ascending: true, selector: #selector(NSString.caseInsensitiveCompare))
如果您希望一次性完成,那么您必須確保在保存 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
通過這樣做,數據將已經在數據庫中排序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.