SwiftUI Core Data - NSPredicate 动态过滤字符串数组属性包含给定字符串的位置
Posted
技术标签:
【中文标题】SwiftUI Core Data - NSPredicate 动态过滤字符串数组属性包含给定字符串的位置【英文标题】:SwiftUI Core Data - NSPredicate dynamically filter where string array attribute contains a given string 【发布时间】:2020-07-21 17:28:23 【问题描述】:基本上如标题所说。
我正在尝试获取具有字符串数组类型的“标签”属性的“目标”,其中“标签”包含一些字符串类型的标签。
我在 SwiftUI 视图的 init() 中有
self.tag = tag
self.results = FetchRequest(
entity: Goal.entity(),
sortDescriptors: [NSSortDescriptor(keyPath: \Goal.createdDate, ascending: true)],
predicate: NSPredicate(format: "tags LIKE %@", "\(self.tag.wrappedTitle)")
LIKE 不会抛出错误,但也不会获取任何内容,即使它应该获取。 CONTAINS 引发 EXC_BAD_ACCESS 错误, IN 抛出“NSInvalidArgumentException”,原因:“-[NSTaggedPointerString countByEnumeratingWithState:objects:count:]:无法识别的选择器发送到实例 0xa6a3cbf31284b686”。不太清楚这个错误是什么意思。
我可以获取所有目标,并且只在视图主体的 ForEach 循环中显示标签包含字符串的目标,但我不认为这是有效的内存使用。
供参考,目标界面
public class Goal : NSManagedObject, Identifiable
extension Goal
@NSManaged public var id: UUID? get set
@NSManaged public var title: String? get set
@NSManaged public var notes: String? get set
@NSManaged public var tags: [String]? get set
@NSManaged public var createdDate: Date? get set
@NSManaged public var deadlineDate: Date? get set
@NSManaged public var completedDate: Date? get set
@NSManaged public var isActive: Bool get set
@NSManaged public var isArchived: Bool get set
@NSManaged public var previousIterations: [UUID]? get set
@NSManaged public var hasBeenDeleted: Bool get set
@NSManaged public var deletedDate: Date? get set
谁能帮忙?
编辑:正如回复中正确指出的那样,不可能动态过滤可转换的数据类型:(解决方法是获取所有并在函数内过滤。
【问题讨论】:
你会为Goal
显示自动生成的界面吗?
当然。现已添加。
因为tags
是一个可转换的属性,所以不能使用基于它的谓词作为获取请求的一部分。有一些解决方法,但我建议将其替换为与 Tag
实体的一对多关系(可能使用一对多逆)。
【参考方案1】:
你可以试试:
NSPredicate(format: "%@ IN tags", "\(self.tag.wrappedTitle)")
【讨论】:
以上是关于SwiftUI Core Data - NSPredicate 动态过滤字符串数组属性包含给定字符串的位置的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)