我有核心数据实体:“mole”,我在TableView中显示。当我依次选择每一个时,我使用...
将选定的痣传递给下一个NIBcontroller.mole = [moleArray objectAtIndex:indexPath.row]; // pass the relevant mole to next NIB
当第二个NIB加载时,我想只检索所选“摩尔”的“细节”。我使用以下内容:
NSManagedObjectContext *context = [mole managedObjectContext]; // find details for the selected mole
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Details" inManagedObjectContext:context];
[request setEntity:entity];
// now sort
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"detailsDate" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
// Having created a fetch request, you now execute it. The events array needs to be mutable, so make a mutable copy of the result.
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[context executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
NSLog(@"details mutableFetchResults = nil");
}
// The final steps are to set the view controller’s events array instance variable and to release objects that were allocated.
[self setDetailsArray:mutableFetchResults];
[mutableFetchResults release];
[request release];
麻烦的是“detailsArray”正在返回所有 Moles的详细信息。我似乎无法检索所选的特定鼹鼠的详细信息。我认为设置“上下文”是不正确的。帮助赞赏。
答案 0 :(得分:2)
Mole
实体与Details
有多对多的关系吗?如果是这样,您可以遍历该关系,而不必执行获取请求。假设你确实有这种关系,并称之为details
。你可以这样做:
NSSet *details = [mole valueForKey:@"details"];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"detailsDate" ascending:NO];
NSArray *detailsArray = [details sortedArrayUsingSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
// [sortDescriptor release]; if you're not using ARC
诀窍是关系被建模为NSSet
个对象,因此您仍然需要对值进行排序以获得有序数组。
答案 1 :(得分:0)
您的问题是您没有通过“细节”实体过滤搜索。您应该使用传递给下一个控制器的痣的痣(或某种标识符)进行NSPredicate以过滤该搜索,并且只得到您想要的痣
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"moleID == %@", mole.id];
这样的事情,希望这会有所帮助。
答案 2 :(得分:0)
如果您已拥有Mole
托管对象,则无需提取即可找到相关的Detail
对象。相反,你只是走了这段关系。
听起来你有一个像这样的数据模型:
Mole{
//.. some attributes
details<-->>Detail.mole
}
Detail{
//... some attributes
mole<<-->Mole.details
}
如果您有自定义的NSManagedObject子类,那么您只需使用aMole.details
来获取一组相关的详细信息:
NSSet *details=aMoleObj.details;
如果您只使用通用NSManagedObjects,那么您将使用:
NSSet *details=[aMoleObj valueForKey:@"details"];
获取总是用于找到您没有关系的对象。如果您已经掌握了相关对象,则只需查询关系即可。