假设一个名为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"]];
可能的解决方案是:
numberOfSectionsInTableView:
中,我们只需查看部分名称并将其与x
进行比较即可。然后我们可以在tableView:numberOfRowsInSection:
中查看这些名称并计算我们需要的内容。但那也感觉很脏。比第一种方法更好,但仍然。更新 好吧,我几乎想出了第三种方法。感谢@Dima的链接。 这是代码:
[self setFetchedResultsController: [[NSFetchedResultsController alloc]
initWithFetchRequest: request
managedObjectContext: context
sectionNameKeyPath: [NSString stringWithFormat: @"numValue.compare(%f)", x]];
但是KVC合规存在问题: 带参数的方法(选择器)显然不符合KVC。 任何解决方法的想法?
答案 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。