核心数据:将额外的上下文传递给使用NSFetchedResultsController获取的对象?

时间:2010-01-25 16:42:30

标签: sql core-data nsfetchedresultscontroller

我在文档描述的方式中使用NSFetchedResultsController几乎是开箱即用的。这是我的代码的摘录。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"SomeEntity"
                                          inManagedObjectContext:moc];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"id" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];

NSPredicate *somePredicate = [NSPredicate predicateWithFormat:@"ANY buckets.name == %@", bucketId];
[fetchRequest setPredicate:somePredicate];

frc = [[NSFetchedResultsController alloc] 
       initWithFetchRequest:fetchRequest
       managedObjectContext:moc
       sectionNameKeyPath:@"titleAccessor"
       cacheName:@"frc"];
[fetchRequest release];

注意两件事:

1)谓词。在我的数据模型中,SomeEntity和存储桶具有多对多关系。谓词说“返回其相关桶对象具有此名称的所有SomeEntity对象”。按预期工作。

2)我正在使用sectionNameKeyPath。它实际上是模型对象中的一个方法,它根据某些应用程序逻辑进行一些计算并返回标题。按预期工作。

现在,问题是:

如何连接这两个东西并让“titleAccessor”方法知道谓词?我希望节标题根据谓词而不同(确切地说,取决于我在谓词中使用的bucketId)。说清楚:

现在titleAccessor如此工作:

return @"result of some calculation"

我想让它成功:

if (bucketId == a):
    return @"aPrefix" + @"result of some calculation"
else if (bucketId == b):
    return @"bPrefix" + @"result of some calculation"

我有两个思路:1)如果这是一个普通的CD提取(如果有这样的事情),我可以设置一些模型对象的volatile属性并使用它。但是,我无法访问NSFetchedResultsController结果对象。 2)如果这是SQL,我会做一些像'选择a,b,c那样的东西'来自blah;'在运行时,“c”将是所需的值,然后我可以将其用作属性。但是,这不是SQL。 :)

如何实现上述所需的行为?

更新

当然,您在发布问题后立即自行找出答案。 (我想发帖是治疗的一部分。)我刚刚意识到我将以下内容放在我的tableviewcontroller委托中,文档说:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[frc sections] objectAtIndex:section];
    return [sectionInfo name];
}

我可以在这里进行必要的破坏。这是最好的方法吗?说“是”并提出一些简单的观点。 :)(或建议更好的方法。)

1 个答案:

答案 0 :(得分:0)

这似乎是我能想到的最干净的方法。我无法知道实体可以回到获取它的谓词。