如何获取父级的所有子实体?
我有一个由Core Data中的父实体填充的表。当用户触摸一个单元格时,我打算显示另一个表格,其中包含该父项的所有子项。
NSFetchRequest
对此有何看法?
修改
模型是这样的:
学生>>日期[一对多,一名学生有很多天]
所以我想要任何特定学生的所有日期(通过触摸该学生的学生表格单元格选择),然后填写日期表格以及该学生的日期。
谢谢!
答案 0 :(得分:2)
假设实体和类名称为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]];
答案 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
课程。当用于在表格中显示数据时,它具有优势。