NSArray 作为核心数据 fetchRequest 中的参数
Posted
技术标签:
【中文标题】NSArray 作为核心数据 fetchRequest 中的参数【英文标题】:NSArray as parameter in Core Data fetchRequest 【发布时间】:2016-09-10 13:47:44 【问题描述】:我有大约 10.000 个实体的数据库和 50 个 NSString 元素的动态 NSArray。想检查这些元素中的每一个是否存在于数据库中并创建存在的新数组。我不需要返回整个实体,只需返回那些 NSString 标题(与 NSString 数组中的相同)
NSPredicate 应该将 entity.title 与 NSString 元素进行完全匹配的比较。
什么是最好的和处理器/内存效率最高的方法?
【问题讨论】:
【参考方案1】:我认为您应该在谓词中使用“in”操作来获得结果。这使您可以利用数据库来执行比较,而不是带回所有 10,000 条记录来比较自己。如果您采用这种方法,您的代码可能如下所示:
// Assuming that arrayName is your existing array of values to match, that
// EntityName is the object in CoreData that you’re looking at, and context
// is your moc
var newArray: [String] = []
let fetchRequest = NSFetchRequest<EntityName>(entityName: "EntityName")
fetchRequest.predicate = NSPredicate(format: "title in %@", arrayName)
do
result = try context.fetch(fetchRequest)
for element in result
newArray.append(element.title)
catch
… manage any errors …
注意 - 我的目标是 Swift 3.0 兼容代码 - 不确定 swift 是否是您所追求的。
【讨论】:
谢谢。确切地说,我不想拉整张桌子。核心数据应该完成所有工作。这个解决方案是最优的吗?如果没有更多的想法,我会检查这个作为答案。 如果您还没有在 title 属性上添加索引,也可能值得。 pbasdf 建议的索引可能很有用,具体取决于您应用中标题的使用情况,但除此之外,我不知道有什么可以提高这种方法的效率。 我已经用索引测试了这个。在现实世界场景中应该足够快。以上是关于NSArray 作为核心数据 fetchRequest 中的参数的主要内容,如果未能解决你的问题,请参考以下文章
使用 NSArray 从 iOS 上的可转换核心数据创建对象