可转换的 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 和一个Type
的Transformable
,它被设置为一个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的主要内容,如果未能解决你的问题,请参考以下文章