核心数据。忽略To-many谓词

问题描述 投票:1回答:1

我有一个 Group <-->&gt。Member 关系。 在 class Group: NSManagedObject { 我有以下属性。

@NSManaged public var members: Set<Member>

 public var status: Int16 {
    set {
        self.willChangeValue(forKey: "status")
        self.setPrimitiveValue(newValue, forKey: "status")
        self.didChangeValue(forKey: "status")
        self.members.removeAll()
    }
    get {
        self.willAccessValue(forKey: "status")
        var status: Int16 = 0
        if let statusKey = self.primitiveValue(forKey: "status") as? Int16 {
            self.didAccessValue(forKey: "status")
            status = statusKey
        }
        return status
    }
}

In class Member: NSManagedObject 我有以下属性。

@NSManaged public var memberOf: Group?
@NSManaged public var status: Int16

要求:过滤基于:if Groups.status = 1member.status = 1 (每个成员)

我有以下代码。

     let statusPredicate = NSPredicate(format: "status == %@", NSNumber(integerLiteral: 1))
     let statusMemberPredicate = NSPredicate(format: "ANY members.status == %d", 1)
     let compoundPredicate = NSCompoundPredicate(type: NSCompoundPredicate.LogicalType.and, subpredicates: [statusPredicate, statusMemberPredicate])
     print("compoundPredicate \(compoundPredicate)")

     let requestGroups: NSFetchRequest<Group> = NSFetchRequest()
     requestGroups.entity = Group.entity()
     requestGroups.predicate = compoundPredicate
     requestGroups.returnsObjectsAsFaults = false
     requestGroups.fetchBatchSize = 20
     frcGroup = NSFetchedResultsController(fetchRequest: requestGroups, managedObjectContext: moc, sectionNameKeyPath: nil, cacheName: nil)
     try? frcGroup?.performFetch()

     if let members = frcGroup?.fetchedObjects?.first?.members {
            for member in members{
                  print("member.status \(member.status)")
                }
             }
         }

我得到以下日志:

compoundPredicate status == 1 AND ANY members.status == 1
member.status 0
member.status 1
member.status 0

我也试了下面的代码,得到了和上面一样的日志。

let statusMemberPredicate = NSPredicate(format: "members.status CONTAINS %d", 1)

它看起来像是在获取所有的... members 而忽略了 members.status == 1 谓词。

我做错了什么?

swift core-data nsfetchedresultscontroller nsfetchrequest
1个回答
1
投票

这个谓词只决定正在被获取的对象是否应该被包含在结果中。 它对相关对象没有影响。 在你的例子中,如果一个 Groupstatus =1,以及任何相关的 Member 对象有 status = 1,那么它将被包含在结果中。 但其 members 属性不受谓词的影响。 它将包括所有相关的成员,即使它们不符合谓词。 所以你的结果是我所期望的。

如果你想过滤 members在获取Group对象后,你应该单独进行。

© www.soinside.com 2019 - 2024. All rights reserved.