【问题标题】:NSFetchedResultController. Calculating sectionNameKeyPath with expression/by conditionNSFetchedResultController。使用表达式/按条件计算 sectionNameKeyPath
【发布时间】:2012-07-11 03:16:19
【问题描述】:

假设有一个名为 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: 中查看这些名称并计算出我们需要什么。但这感觉也很脏。比第一种方法更好,但仍然如此。

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

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

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

【问题讨论】:

    标签: objective-c ios core-data nsfetchedresultscontroller


    【解决方案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。

    【讨论】:

    • 我不得不在 OP 中说我想要另一种方式,因为为此类事情更改实体感觉有点脏。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多