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 动态过滤字符串数组属性包含给定字符串的位置的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 更改时更新 Swiftui 视图

Core Data - 数据传输 SwiftUI

SwiftUI 将 Core Data 实体读入 []

SwiftUI + Core Data - 更新对象(Detail -> DetailEdit)

SwiftUI Core Data 在 DetailView 中绑定 TextFields

Swift之深入解析如何结合Core Data和SwiftUI