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)