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之间传递和获取实体的主要内容,如果未能解决你的问题,请参考以下文章

iOS 通用应用程序和 nibs / xibs

iPhone 到 iPhone 通信

如何提高 iPhone 上的核心数据获取性能?

iPhone 和 Apple Watch 应用之间的核心数据共享

iPhone核心数据得到孙子

在C#中怎样在两个Form之间传递数据(Winfrom)?