NSFetchedResultsController。使用表达式/按条件计算sectionNameKeyPath

时间:2012-07-11 13:29:32

标签: objective-c ios core-data nsfetchedresultscontroller

假设一个名为testTable的表:

(NSNumber*) numValue
(NSString*) stringValue

然后假设其中有大约50条记录。每个记录都有numValue个不同。 如果我像这样创建NSFetchedResultController:

NSFetchRequest *request = [[NSFetchedResultsController alloc] 
                            initWithFetchRequest: request 
                            managedObjectContext: context 
                            sectionNameKeyPath: @"numValue" 
                            cacheName: @"testTable"]];

然后我会得到50个部分。

我的问题是: 我怎样才能得到2个部分: 首先包含numValue小于x的记录,第二个记录numValue大于同一x的记录。

对于x = 15,它可能如下所示:

NSFetchRequest *request = [[NSFetchedResultsController alloc] 
                            initWithFetchRequest: request 
                            managedObjectContext: context 
                            sectionNameKeyPath: @"numValue > 15" 
                            cacheName: @"testTable"]];

可能的解决方案是:

  1. 我们可以编辑我们的实体,因为@Dima说。
  2. numberOfSectionsInTableView:中,我们只需查看部分名称并将其与x进行比较即可。然后我们可以在tableView:numberOfRowsInSection:中查看这些名称并计算我们需要的内容。但那也感觉很脏。比第一种方法更好,但仍然。
  3. 更新 好吧,我几乎想出了第三种方法。感谢@Dima的链接。 这是代码:

    [self setFetchedResultsController: [[NSFetchedResultsController alloc]
        initWithFetchRequest: request 
        managedObjectContext: context 
        sectionNameKeyPath: [NSString stringWithFormat: @"numValue.compare(%f)", x]];
    

    但是KVC合规存在问题: 带参数的方法(选择器)显然不符合KVC。 任何解决方法的想法?

1 个答案:

答案 0 :(得分:1)

请参阅this回答作为参考。

向实体添加可选属性并使其成为瞬态属性。

然后创建一个getter(假设您的属性名为sectionGroup

- (NSNumber *) sectionGroup
{
  [self willAccessValueForKey:@"sectionGroup"];
  NSNumber *group = [NSNumber numberWithInt:0];
  if(numValue > 15)
  {
    group = [NSNumber numberWithInt:1];
  }
  [self didAccessValueForKey:@"sectionGroup"];
  return group;
}

现在,您可以使用sectionGroup作为sectionNameKeyPath。