[英]How do I count relationships with a particular column value from an NSFetchRequest?
我目前有 2 个实体:
这是一对多的关系,其中一个 List 可以有多个 Item。
项目有一个名为completed
的列。
我想从我的 NSFetchRequest 中获取 Lists completed
Items 的计数。
我知道我可以简单地执行List.Items.count
来获得所有列表项的计数,但我也不知道如何获得已completed
项目的计数。
如何计算与 NSFetchRequest 中的特定列值的关系,甚至是List.Items.count
的某种类型的过滤器/位置?
我不得不将List
重命名为MyList
并将Item
重命名为MyItem
。
这是我获取数据的方式。 首先我使用一个扩展:
extension MyList {
static func getAllMyLists() -> NSFetchRequest<MyList> {
let request: NSFetchRequest<MyList> = MyList.fetchRequest()
let sortDescriptor = NSSortDescriptor(key: "sortOrder", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
}
然后我在视图结构中使用@FetchRequest
:
@FetchRequest(fetchRequest: MyList.getAllMyLists()) var myLists: FetchedResults<MyList>
就像我说的,我不知道如何添加我想要的谓词,以便结果包括已completed
的MyItems
的计数......我在回答中使用了一种糟糕的方法,没有充分利用 fetch 请求由于缺乏知识。
dahiya_boy 和 Joakim 在评论中都是正确的,我不得不使用NSPredicate
和filtered
:
let completedPredicate: NSPredicate = NSPredicate(format: "completed == true")
let completedCount = List.Items.filtered(using: completedPredicate).count
有两种方法:
如果您有对List
object 的引用,只需过滤NSSet
关系
let numberOfCompletedItems = (list.items as. Set<MyItem>).filter{$0.completed}.count
如果您将一对多关系声明为本机Set<MyItem>
,则可以避免强制类型转换
否则获取项目并将谓词添加到获取请求
"TheList"
是列表的名称。 如果没有name
属性,请使用独特的东西。context
是对托管 object 上下文的引用假设MyItem
中有一个反向关系list
let listName = "TheList" let request: NSFetchRequest<MyItem> = MyItem.fetchRequest() request.predicate = NSPredicate(format: "list.name == %@ AND completed == true", listName) do { let completedItems = try context.fetch(request) let numberOfCompletedItems = completedItems.count } catch { print(error) }
请按照以小写字母开头的命名约定命名变量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.