iPhone核心数据:具有不同属性和字母部分的NSFetchRequest

时间:2010-03-07 17:56:06

标签: iphone core-data

我正在尝试创建一个NSFetchRequest,它为UITableView生成结果。

它应该找到所有不同的NSString属性,并将它们分成字母部分('A','B','C'等)

我在NSManagedObject类上设置了一个方法来返回属性的第一个字母:

- (NSString *)entrantFirstLetter
{
     [self willAccessValueForKey:@"entrantFirstLetter"];
     NSString *returnString = [self.entrant substringToIndex:1];
     [self didAccessValueForKey:@"entrantFirstLetter"];
     return returnString;
}
  • 我将'sectionNameKeyPath'设置为@“entrantFirstLetter”,这非常有效

  • 但是,我现在需要将returnsDistinctResults设置为YES

  • 但是,仅当设置了propertiesToFetch时,returnsDistinctResults才有效,所以

  • 我将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];

2 个答案:

答案 0 :(得分:1)

您正在尝试复制NSFetchResultsController's默认部分行为。

相反,只需将sectionNameKeyPath:设置为entrant,FRC就会为您创建各个部分而不需要您付出更多努力。

答案 1 :(得分:1)

所以,最后这对NSFetchResultsController完全不起作用(这是在3.1.3 SDK下)。我只是在loadView中执行了我自己的NSFetchRequest,它根据首字母将所有进入者排序到数组中,同时存储有效的节标题名称。

也许Apple修复了4.x中描述的问题,但我从未需要此功能或更新此项目。