使用 NSPredicate 从 Core Data 访问对象

Posted

技术标签:

【中文标题】使用 NSPredicate 从 Core Data 访问对象【英文标题】:Accessing objects using NSPredicate from Core Data 【发布时间】:2014-01-25 02:01:09 【问题描述】:

我试图找到我的简单问题的答案,但没有运气......我正在研究 CoreData,我有两个实体让我们以“照片和摄影师”一对多关系为例,这意味着一位摄影师可以有多个照片...现在我确实使用

存储对象
[NSEntityDescription insertNewObjectForEntityForName...]

我在检索特定摄影师的“所有照片”时遇到问题。我正在使用此代码

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Photographer"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name = %@",@"photographerName"];
fetchRequest.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"timeStamp" ascending:YES]];

此代码正在返回摄影师,但我只需要此摄影师拍摄的所有照片。 我是 CoreData 的新手,我不确定我是否应该使用“照片”实体?

提前致谢。

【问题讨论】:

从这里看来,您正在尝试对您的摄影师进行排序。先找摄影师,然后你就可以拿到照片了。 【参考方案1】:

您的提取请求应请求Photo 实体。

然后,在你的谓词中,你可以像这样指定摄影师的名字:

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photographer.name = %@",@"photographerName"];

或者更好的是,先获取摄影师对象,然后在谓词中测试关系会快得多:

Photographer* photographer = ... //Get required photographer here
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"photographer = %@", photographer];

【讨论】:

我对你的方法很感兴趣。使用上面使用的方法获取照片会更快,还是只从photographer.photos 获取PhotoNSSet 对象并对其进行排序? @cabellicar123 使用维护的photos 关系也会很快,因为它已经包含图像列表,并且不会执行查询。请记住,当您访问关系时,该关系中的项目会出错,而获取请求中的项目不会。【参考方案2】:

使用它对photographer.photos 数组进行排序。

NSSortDescriptor *sortKey = [[NSSortDescriptor alloc] initWithKey:@"timestamp" ascending:YES];
NSArray *sorters = [NSArray arrayWithObject:sortKey]; 
NSArray *sortedArray = [photographer.photos sortedArrayUsingDescriptors:sorters];

【讨论】:

以上是关于使用 NSPredicate 从 Core Data 访问对象的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 NSPredicate 过滤 Core Data 托管对象?

iPhone如何使用NSPredicate按父实体过滤Core Data?

使用 NSPredicate 遍历多个 Core Data 对象

Core Data NSPredicate 按数组中的项目过滤项目集

ios 如何正确使用 NSPredicate 来匹配 Core Data 的 NSString?

Core Data 中的 URI 类型属性:如何使用 NSPredicate 进行查询