1

假设有一个名为 testTable 的表:

(NSNumber*) numValue
(NSString*) stringValue

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

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

那我会得到50个部分。

我的问题是:如何获得 2 个部分:第一个包含numValue小于 somex的记录,第二个包含numValue大于相同的记录x

因为x = 15它可能看起来像这样:

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

可能的解决方案是:

  1. 我们可以像@Dima 所说的那样编辑我们的实体。
  2. 在 中,numberOfSectionsInTableView:我们可以只查看部分名称并将它们与x. 然后我们可以查看这些名称tableView:numberOfRowsInSection:并计算我们需要什么。但这感觉也很脏。比第一种方法好,但仍然。

更新: 嗯,我几乎想出了第三种方法来做到这一点。感谢@Dima 的链接。这是代码:

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

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

4

1 回答 1

1

请参阅答案作为参考。

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

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

于 2012-07-11T14:15:48.573 回答