可转换的 CoreData NSPredicate 导致 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】可转换的 CoreData NSPredicate 导致 EXC_BAD_ACCESS【英文标题】:CoreData NSPredicate on a Transformable causes EXC_BAD_ACCESS 【发布时间】:2017-12-13 12:49:52 【问题描述】:

使用NSPredicate 在Core Data 中搜索Transformable 中是否存在数组元素的正确方法是什么?

我有一个Entity 和一个Attribute OperatingDays 和一个TypeTransformable,它被设置为一个Custom Class [Int]。 我用它来存储整数数组。它可以存储但我在尝试使用 NSPredicate 获取它们时得到EXC_BAD_ACCESS

我知道

operationalDays 是 1,2,3,4

我正在尝试,但它们都因错误而失败。

//day is an Int (1) in this case

NSPredicate(format: "%d IN operationalDays",day) 
NSPredicate(format: "%i IN operationalDays",day) 
NSPredicate(format: "%@ IN operationalDays",day) 
NSPredicate(format: "operationalDays CONTAINS %d",day) 
NSPredicate(format: "operationalDays CONTAINS %i",day)
NSPredicate(format: "operationalDays CONTAINS %@",day)

当我在崩溃后检查谓词时,我得到

谓词:(1 IN OperatingDays);

谓词:(operationalDays CONTAINS 1)

【问题讨论】:

不确定我是否记错了,但如果我记错了,那么可转换实际上是二进制数据,可能会被序列化,所以在你的情况下,很可能由一些类似 XML 的格式表示,它有足够的信息来重建你的数组.但就数据库而言,这些是原始二进制数据,您可能不会对它们使用谓词。如果可能,请尝试添加另一个您在其中进行搜索的字符串字段。保存实体时,从您要搜索的所有字段中构造此字符串。 是的,我就是这么想的。只是希望 Swift 中有一些魔法来处理这样的 NSPredicates 我认为这与NSPredicate 无关,只是SQL 查询失败。但同样,我对其中任何一个都不是 100% 确定,所以也许有人提出了解决方案。 【参考方案1】:

可转换属性作为二进制数据存储在 Sqlite DB 中。除非您的谓词也具有二进制数据,否则您无法对该数据运行查询。可转换属性遵循 NSCoding 协议,因此,Core Data 知道如何序列化和反序列化属性。

附:要查看 Sqlite 抛出的错误,请尝试添加

-com.apple.CoreData.SQLDebug 1

到 Xcode 方案中的“启动时传递的参数”。

【讨论】:

不知如何做到这一点。我是否添加 -com.apple.CoreData.SQLDebug 并将其值设置为 1 ? 我添加了图片,以便更清晰。如果它回答了您的问题,您可以将此答案标记为正确。【参考方案2】:

你应该使用这种风格的谓词

let predicate = NSPredicate(format: "%@ IN days", argumentArray: [valueOfArgumentHere])

【讨论】:

以上是关于可转换的 CoreData NSPredicate 导致 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

CoreData NSPredicate

具有多个 NSSet 的 CoreData NSPredicate

核心数据:NSPredicate 对象由实体对象组成

CoreData:基于关系的 NSPredicate

CoreData 和 NSPredicate

CoreData:NSPredicate 按日期过滤