使用 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
获取Photo
的NSSet
对象并对其进行排序?
@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 按数组中的项目过滤项目集