Core data 使用NSPredicate根据数组属性筛选CoreData项的列表 上下文

Core data 使用NSPredicate根据数组属性筛选CoreData项的列表 上下文,core-data,swiftui,nspredicate,Core Data,Swiftui,Nspredicate,我有一个称为“任务”的核心数据实体 “任务”与另一个名为“标记”的实体有关系:@NSManaged public var tags:NSSet? 此数据存储为: public var tagsArray: [Tag] { let set = tags as? Set<Tag> ?? [] return set.sorted { $0.wrappedTagTitle < $1.wrappedTagTitle } } (请原谅init中的

我有一个称为“任务”的核心数据实体

“任务”与另一个名为“标记”的实体有关系:
@NSManaged public var tags:NSSet?
此数据存储为:

public var tagsArray: [Tag] {
    let set = tags as? Set<Tag> ?? []

    return set.sorted {
        $0.wrappedTagTitle < $1.wrappedTagTitle
    }
}
(请原谅init中的随意代码,我只是想了解我要做的事情。)

结果 就目前情况而言,这会在运行时崩溃。
任何帮助都将不胜感激。

当前的问题是,您正在调用
标记()
来创建一个新实例,该实例不调用指定的初始值设定项。要创建新的
标记
,您需要使用
标记(上下文:NSManagedObjectContext)
。您正试图使用未正确初始化的对象,因此导致崩溃

这只是问题的一部分。如果你解决了这个问题,你就可以解决崩溃问题,但结果是零。另一个问题是,您不应该为fetch创建新的
标记。核心数据谓词寻找精确匹配——没有什么比
equalable
更合适的了,它也不会寻找其他具有相同标题的
标记。它将寻找准确的标签。但是,因为您刚刚创建了该标记,而且它没有连接到任何任务,所以您将获得零结果。
CONTAINS
操作符将不匹配任何内容,因为没有
任务
包含您刚刚创建的
标记

要通过关系匹配上的属性值,在本例中,通过
tags
关系匹配
Tag.title
,谓词如下所示

NSPredicate(format: "any tags.title = %@", tagFilterName)

在获取
任务
时,这会要求任何
任务
,其中
标记
关系的任何成员的值都等于
tagFilterName

。除上述Tom的观点外,请注意(对于SQLite存储)CoreData在获取时不会识别计算属性
tagsArray
。但是您可以使用底层关系,
tags
,即“any tags.title==%@”。哎呀,我忘了
tagsArray
是一个计算属性。修正了,谢谢你的接球。
FilteredScrollView(tagFilterName: "School")
NSPredicate(format: "any tags.title = %@", tagFilterName)