Iphone NSFETCH请求父级的所有子级
如何获取父对象的所有子实体 我有一个由核心数据中的父实体填充的表。当用户触摸一个单元格时,我打算显示另一个包含该父项所有子项的表 对于这个问题,Iphone NSFETCH请求父级的所有子级,iphone,ios,core-data,nsfetchrequest,Iphone,Ios,Core Data,Nsfetchrequest,如何获取父对象的所有子实体 我有一个由核心数据中的父实体填充的表。当用户触摸一个单元格时,我打算显示另一个包含该父项所有子项的表 对于这个问题,NSFetchRequest看起来怎么样 编辑: 模型是这样的: 学生>>日期[一对多,一个学生有很多天] 所以我想要任何给定学生的所有日期(通过触摸该学生的学生表单元格来选择),然后用该学生的日期填充日期表 谢谢 假设实体和类名是Student和Date,则Date->Student的反向关系称为Student Student *aStudent =
NSFetchRequest
看起来怎么样
编辑:
模型是这样的:
学生>>日期[一对多,一个学生有很多天]
所以我想要任何给定学生的所有日期(通过触摸该学生的学生表单元格来选择),然后用该学生的日期填充日期表
谢谢 假设实体和类名是
Student
和Date
,则Date
->Student
的反向关系称为Student
Student *aStudent = ...;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity: [NSEntityDescription entityForName: @"Date" inManagedObjectContext: [aStudent managedObjectContext]]];
[fetchRequest setPredicate: [NSPredicate predicateWithFormat: @"student == %@", aStudent]];
如果您有自定义类,则可以遍历生成的关系(
return[student dates]
)。这将使您在iOS4上获得一个无序的NSSet,或者,您可以通过一个获取请求来完成(注意,我使用ARC,所以这里没有发布/自动删除):
在第一个表委托中,当您触摸特定单元格时,我将向第二个表控制器注入特定的父属性。例如:
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
类。当用于在表中显示数据时,它具有优势。不需要单独的获取请求。通过从student对象访问关系(类似于student.dates
),可以使用to-many关系中的所有对象(不要称它们为子实体,这是误导和不正确的)。这将为您提供一个NSSet,如果需要,您可以对其进行排序并将其转换为数组 没有模型就很难理解问题。分享一些细节。@Flex_上瘾了,谢谢,请看editnice帖子。关键是反向关系。若并没有反向关系,那个么使用fetch请求将更加困难。
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...