Swift 核心数据谓词

Swift Core Data Predicate

我想使用“NSPredicate”使用关系 属性 值过滤核心数据(每个子列表有一个原始列表,每个列表有很多子列表)

子列表实体

@NSManaged public var addedDate: Date?
@NSManaged public var id: UUID?
@NSManaged public var index: Int16
@NSManaged public var title: String?
@NSManaged public var origin_List: ListOfTasks?   // its optional and I need to filter sublist using its id property
@NSManaged public var tasks: NSSet?

列表实体

@NSManaged public var id: UUID? // filter sublist using this id
@NSManaged public var index: Int16
@NSManaged public var title: String?
@NSManaged public var comments: NSSet?
@NSManaged public var groupSublists: NSSet?
@NSManaged public var origin_Group: ListOfTasks?
@NSManaged public var sublists: NSSet?   // The sublists

所以我需要确保 origin_list 不为零,对于 origin_list.id 我有 wrappedId 然后查找 id 是否等于特定 id,在 swift 中就像以下代码

    if sublist.origin_List != nil && sublist.origin_List!.wrappedId == someId {
        // get all the matched sublists
    }

但我不知道如何将其传递给“NSPredicate”

使用“%K != nil”检查 nil,因此谓词的第一部分将是

NSPredicate(format: "%K != nil", #keyPath(Sublist.origin_List))

(将 Sublist 替换为该实体的实际名称)

第二部分将使用与 swift

中类似的点符号
NSPredicate(format: "%K = %@", 
            argumentArray: [#keyPath(Sublist.origin_List.id), someId])

然后可以将其组合成一个复合谓词

NSCompoundPredicate(andPredicateWithSubpredicates: [
        NSPredicate(format: "%K != nil", #keyPath(Sublist.origin_List)),
        NSPredicate(format: "%K = %@", 
                    argumentArray: [#keyPath(Sublist.origin_List.id), someId])
    ])

话虽如此,您应该先尝试仅使用第二个谓词,因为我怀疑 SQL 中的 nil 检查是多余的。所以希望答案很简单

NSPredicate(format: "%K = %@", 
            argumentArray: [#keyPath(Sublist.origin_List.id), someId])