繁体   English   中英

如何计算与 NSFetchRequest 中特定列值的关系?

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

  • MyList -> MyItem 在核心数据中是一对多的(所以我可以在获取的结果中使用 myList.myItems)
  • MyItem -> MyList 在 Core Data 中是多对一的(所以我可以在获取的结果中使用 myItem.myList)

这是我获取数据的方式。 首先我使用一个扩展:

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>

就像我说的,我不知道如何添加我想要的谓词,以便结果包括已completedMyItems的计数......我在回答中使用了一种糟糕的方法,没有充分利用 fetch 请求由于缺乏知识。

dahiya_boy 和 Joakim 在评论中都是正确的,我不得不使用NSPredicatefiltered

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM