假设有一个名为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"]];


可能的解决方案是:


我们可以按照@Dima所说的来编辑我们的实体。
numberOfSectionsInTableView:中,我们可以仅查看部分名称并将它们与x进行比较。然后,我们可以在tableView:numberOfRowsInSection:中查看这些名称并计算所需的内容。但这也很脏。比第一种方法更好,但仍然如此。


更新:
好吧,我几乎想出了第三种方法。感谢@Dima的链接。
这是代码:

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


但是KVC合规性存在问题:
带参数的方法(选择器)显然不符合KVC。
有解决方法的主意吗?

最佳答案

请参见this答案作为参考。

将可选属性添加到实体,并使其成为临时属性。

然后创建一个吸气剂(假设您的属性称为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。

关于objective-c - NSFetchedResultsController。用表达式/按条件计算sectionNameKeyPath,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11433759/

10-08 23:30