父亲的所有孩子的NSFetchRequest

时间:2012-02-26 11:36:59

标签: iphone ios core-data nsfetchrequest

如何获取父级的所有子实体?

我有一个由Core Data中的父实体填充的表。当用户触摸一个单元格时,我打算显示另一个表格,其中包含该父项的所有子项。

NSFetchRequest对此有何看法?

修改

模型是这样的:

  

学生>>日期[一对多,一名学生有很多天]

所以我想要任何特定学生的所有日期(通过触摸该学生的学生表格单元格选择),然后填写日期表格以及该学生的日期。

谢谢!

4 个答案:

答案 0 :(得分:2)

假设实体和类名称为StudentDate,并且Date - > Student的反向关系称为student

Student *aStudent = ...;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName: @"Date" inManagedObjectContext: [aStudent managedObjectContext]]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"student == %@", aStudent]];

答案 1 :(得分:1)

您不需要单独的获取请求。通过从学生对象访问关系(例如student.dates),可以获得来自to-many关系的所有对象(不要将它们称为子实体,这是误导性的和不正确的)。这为您提供了一个NSSet,您可以根据需要对其进行排序并将其转换为数组。

答案 2 :(得分:0)

如果您有自定义类,则可以遍历生成的关系(return [student dates])。这将在iOS4上为您提供无序的NSSet,或者,您可以使用获取请求(请注意我使用ARC,因此这里没有发布/自动释放):

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Date"
                                          inManagedObjectContext:moc];
[fetchRequest setEntity:entity];

NSMutableArray *predicates = [NSMutableArray arrayWithCapacity:3];
[predicates addObject:[NSPredicate predicateWithFormat:@"student == %@", aStudent]];

// You might add other predicates
[fetchRequest setPredicate:[NSCompoundPredicate andPredicateWithSubpredicates:predicates]];

// and if you want sorted results (why not, get the database to do it for you)
// sort by date to the top
NSArray *sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"dateAdded" ascending:NO]];
}
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
NSArray *sorted = [moc executeFetchRequest:fetchRequest error:&error];
if (error) {
    // Handle the error, do something useful
}

return sorted;

答案 3 :(得分:0)

在您的第一个表委托中,当您触摸特定单元格时,我会将特定的父属性注入第二个表控制器。例如:

SecondController secondController = ... // alloc-init
secondController.studentToGrab = ...

其中SecondController声明具有studentToGrab属性,如下所示:

@property (nonatomic, retain) Student* studentToGrab; // use strong with ARC, if non-ARC remember to release it

并在定义中合成它。

然后在你的第二个控制器中,你可以在viewDidLoad方法中执行:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourNameEntityForDate" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"student == %@", studentToGrab];
[fetchRequest setPredicate:predicate];

// you can also use a sortdescriptors to order dates...

NSError *error = nil;
NSArray *resultArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error != nil) {

    NSLog(@"Error: %@", [error localizedDescription]);
    abort();
}

// use resultArray to populate something...

评论,当您处理表格时,您也可以使用NSFetchedResultController课程。当用于在表格中显示数据时,它具有优势。