iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest
Posted
技术标签:
【中文标题】iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest【英文标题】:iPhone Core Data: NSFetchRequest with distinct properties and alphabet sections 【发布时间】:2010-03-07 17:56:05 【问题描述】:我正在尝试创建一个为 UITableView 生成结果的 NSFetchRequest。
它应该找到所有不同的 NSString 属性,并将它们分成字母部分('A'、'B'、'C'等)
我在我的 NSManagedObject 类上设置了一个方法来返回属性的第一个字母:
- (NSString *)entrantFirstLetter
[self willAccessValueForKey:@"entrantFirstLetter"];
NSString *returnString = [self.entrant substringToIndex:1];
[self didAccessValueForKey:@"entrantFirstLetter"];
return returnString;
我将 'sectionNameKeyPath' 设置为 @"entrantFirstLetter" 并且效果很好
但是,我现在需要将returnDistinctResults 设置为YES
但是,returnDistinctResults 只有在设置了 propertiesToFetch 时才有效,所以
我将 propertiesToFetch 设置为“entrant”(我感兴趣的属性)
但是,为了让 propertiesToFetch 起作用,resultType 必须是 NSDictionaryResultType,所以
我将 resultType 设置为 NSDictionaryResultType
但是,这个 resultsType 意味着我的 @"entrantFirstLetter" 的 'sectionNameKeyPath' 不再有效。
那么,您认为答案是将“entrantFirstLetter”添加到 propertiesToFetch 中?但由于它不是 NSEntityDescription 上的属性,所以我不能!
我想要做的就是将 Core Data 中的字符串列表分类到字母部分并且没有重复。我可以让每个部分独立工作,但让它们一起工作依赖于看似无止境的依赖循环,我找不到让它们全部工作的方法。
任何想法将不胜感激,
罗素。
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
NSDictionary *properties = [entity propertiesByName];
NSArray *propertiesToFetch = [NSArray arrayWithObject:[properties objectForKey:@"entrant"]];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:propertiesToFetch];
[fetchRequest setReturnsDistinctResults:YES];
NSSortDescriptor *entrantDescriptor = [[NSSortDescriptor alloc] initWithKey:@"entrant" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:entrantDescriptor]];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:@"entrantFirstLetter" cacheName:nil];
【问题讨论】:
您是否在数据模型中将“entrantFirstLetter”定义为“Project”实体的临时属性? 嘿,谢谢你的想法。我将它添加为瞬态属性,但它没有效果。因此,我也尝试将 'entrantFirstLetter' 添加到 propertiesToFetch,但它因以下异常而崩溃:原因:'Invalid property (您正在尝试复制 NSFetchResultsController's
默认部分行为。
相反,只需将sectionNameKeyPath:
设置为entrant
,FRC 就会为您创建这些部分,而您无需付出更多努力。
【讨论】:
这会将每个参赛者分组到自己的部分。 不,它会像通讯录应用一样工作。它将entrants
属性以相同字母开头的所有Property
对象分组在一个部分中。如果想要自定义行为,您可以继承 NSFetchResultsController。有关详细信息,请参阅课程的文档。
你也可以在你的核心数据实体类中添加一个方法来返回一个自定义的部分字符串,并在 sectionName 键路径中指定它
@Mike Weller -- 你可以这样做,但通过将显示逻辑放入模型中会破坏封装。当您需要多个自定义部分时会发生什么?您是否为每次更改修改模型。当你改变界面时会发生什么?如果您想将模型重用于另一个应用程序会发生什么?我们使用 MVC 是有原因的。
把它放在一个类别中。事实是 sectionNameKeypath 必须在对象本身上,所以你没有太多选择。如果它属于一个类别,则它的分离度相当好。【参考方案2】:
因此,最终这对于 NSFetchResultsController 根本不起作用(这是在 3.1.3 SDK 下)。我刚刚在 loadView 中做了自己的 NSFetchRequest,它根据所有进入者的首字母将所有进入者排序到数组中,同时存储有效的节标题名称。
也许 Apple 修复了 4.x 中描述的问题,但我从此不再需要此功能或更新此项目。
【讨论】:
以上是关于iPhone 核心数据:具有不同属性和字母部分的 NSFetchRequest的主要内容,如果未能解决你的问题,请参考以下文章
使用具有不同单元格数的部分的 UITableView 的核心数据
如何仅将具有不同属性的对象添加到核心数据到多关系 NSSet