iPhone核心数据:如何在NIBS之间传递和获取实体

时间:2011-10-23 13:44:26

标签: iphone uitableview core-data nsmanagedobjectcontext

我有核心数据实体:“mole”,我在TableView中显示。当我依次选择每一个时,我使用...

将选定的痣传递给下一个NIB
controller.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的详细信息。我似乎无法检索所选的特定鼹鼠的详细信息。我认为设置“上下文”是不正确的。帮助赞赏。

3 个答案:

答案 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"];

获取总是用于找到您没有关系的对象。如果您已经掌握了相关对象,则只需查询关系即可。