iPhone核心数据:如何在NIBS之间传递和获取实体
Posted
技术标签:
【中文标题】iPhone核心数据:如何在NIBS之间传递和获取实体【英文标题】:iPhone core data: How to pass and fetch Entities between NIBS 【发布时间】:2011-10-23 13:44:25 【问题描述】:我有核心数据实体:“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”正在返回所有鼹鼠的详细信息。我似乎无法仅检索所选特定 Mole 的详细信息。我认为设置“上下文”不正确。帮助表示赞赏。
【问题讨论】:
【参考方案1】: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
对象,因此您仍然需要对值进行排序以获得有序数组。
【讨论】:
像魅力一样工作。谢谢亚历克斯:)【参考方案2】:您的问题是您没有过滤您的详细信息实体的搜索。您应该使用传递给下一个控制器的痣的痣 id(或某种标识符)创建一个 NSPredicate 以过滤该搜索并只获取您想要的痣
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"moleID == %@", mole.id];
类似的,希望对你有帮助。
【讨论】:
另一种可能的解决方案是,如果您的 Mole 和 Details 实体之间存在关系,您可以只检索来自该 mole 的详细托管对象。在您的新控制器中执行类似 NSManagedObject *detail = mole.detail; 的操作假设是 1-1 关系,1-N 关系可能会发生一些变化。 嗨赫兹。它是一对多的关系,即一个鼹鼠对象可以有 n 个细节对象。不知何故,我想检索特定痣的所有细节对象 然后你可以用一个 NSSet 来做,就像有人刚刚在下面说的那样: NSSet *details=[mole valueForKey:@"details"];然后你可以使用 NSSet 方法来检索一个 NSArray 或者你需要的任何东西。【参考方案3】:如果您手头已有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"];
Fetch 总是用于查找与您没有关系的对象。如果您手头已有相关对象,则只需查询该关系。
【讨论】:
您好 TechZen。 Mole 和Details 是独立的实体,它是一对多的关系,即每个mole 都有n 个详细信息。那样的话,是不是NSSet details=mole?再次感谢。以上是关于iPhone核心数据:如何在NIBS之间传递和获取实体的主要内容,如果未能解决你的问题,请参考以下文章