假设有一个名为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/