如何根据B的属性之一从A到B的多对多关系中获取特定的B管理对象?

时间:2012-03-05 00:33:33

标签: ios cocoa-touch core-data

也就是说,我有一个与实体B有多对多关系的实体A.除其他属性外,B实例还有一个creationDate。而且我在内存中也已经有了A的托管对象。

所以我知道我可以通过A的访问者访问所有B实例。但是我想做一些事情:

“对于A.relationshipName中的所有B,返回具有最新B.creationData的B的托管对象”

我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

如何执行其他获取请求:

假设一对多方面的关系名称为a

// 1
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity  = [NSEntityDescription entityForName:@"B"
                                           inManagedObjectContext:self.managedObjectContext];
fetchRequest.entity = entity;

// 2
fetchRequest.fetchLimit = 1;

// 3
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"self.a = %@", previouslyFetchedAObject];

// 4
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate"
                                                               ascending:NO];

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
fetchRequest.sortDescriptors = sortDescriptors;

用简单的英语

  1. 为B
  2. 创建新的抓取请求
  3. 设置提取限制,以便只返回1个对象
  4. 设置一个谓词,该谓词仅拉回与已获取的A对象有关系的对象
  5. 设置日期下降的顺序,以便您首先获得最新日期

答案 1 :(得分:0)

或者,由于您已在内存中拥有托管对象A,因此您可以对A->> B关系进行内存中过滤排序。

A *inMemoryA = ...

id byDate = [NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES];
id sorters = [NSArray arrayWithObjects:byDate, nil];
NSArray *sortedBs = [inMemoryA allBs] sortedArrayUsingDescriptors:sorters];

B *mostRecentB = [sortedBs lastObject];