核心数据:fetchResultsController中的NSPredicate可以将每行的多个对象返回到我的表视图中吗?

时间:2013-07-25 16:42:47

标签: ios uitableview nspredicate nsfetchedresultscontroller

换句话说,

fetchedResultsController可以返回一个数组数组吗?还是一组NSSets?

下面的代码是我正在尝试做的一个例子。可能吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //...
    NSSet *objects = [_fetchedResultsController objectAtIndexPath:indexPath];
    //...
}

我这样做的原因是:如果用户滑动单元格并删除它。我需要删除该行中的所有对象。而且我还需要在该日/行的所有时钟上进行计算,以显示该单元格上的数据。

这是我的核心数据模型:

enter image description here

每一行必须包含基于它的clockIn属性的给定日期的所有Clock对象。 clockIn是一个NSDate对象。一行应该代表一天。

我可以帮忙找出这个谓词吗?它甚至可能吗?

另外,我已经在Table View中使用了部分。所以这些都是不可能的。 有一个解决方案,我宁愿不去,创建年,月和日,实体。这样可以解决。但是我觉得我需要做到这一点似乎很奇怪,考虑到我的clockIn属性应该给我所需要的一切......

谢谢!

2 个答案:

答案 0 :(得分:0)

不,它不能。

如上所述:NSPredicate something equivalent of SQL's GROUP BY

“CoreData是一个对象图管理框架,而不是SQL数据存储。因此,您应该尽快 - 让自己脱离SQL思维模式。”

关于手中的问题:

“NSPredicate旨在作为对象图中合格对象的意外谓词。因此,您可以获取与查询匹配的所有对象,但这与对这些结果进行分组不同。如果您要这样做聚合操作,使用键值编码的集合运算符。核心数据可能会将这些转换为合理的SQL,但这只是一个实现细节。“

答案 1 :(得分:0)

您可以使用TLIndexPathTools通过子类化TLIndexPathControllerNSFetchedResultsController的替代方法,在几行代码中完成此操作。我没有对此进行过测试,但这里有一个类似于它的样子:

#import <TLIndexPathController.h>
@interface GroupedIndexPathController : TLIndexPathController
@end

#import "GroupedIndexPathController.h"
#import "TLIndexPathSectionInfo.h"
@implementation GroupedIndexPathController

- (void)setDataModel:(TLIndexPathDataModel *)dataModel
{
    NSMutableArray *items = [[NSMutableArray alloc] initWithCapacity:dataModel.numberOfSections];
    for (TLIndexPathSectionInfo *sectionInfo in dataModel.sections) {
        if (sectionInfo.objects) {
            [items addObject:sectionInfo.objects];
        }
    }
    TLIndexPathDataModel *groupedDataModel = [[TLIndexPathDataModel alloc] initWithItems:items andSectionNameKeyPath:nil andIdentifierKeyPath:nil];
    [super setDataModel:groupedDataModel];
}

@end

您要做的是设置索引路径控制器的获取请求,并将sectionNameKeyPath设置为您要分组的属性。执行提取时,父类将生成组织成部分的数据模型。上面的代码会覆盖dataModel属性设置器,将这些部分映射到分组对象的单个部分,如:

分段数据模型

Section 0
    Managed Object 0.0
    Managed Object 0.1
    Managed Object 0.2
Section 1
    Managed Object 1.0
    Managed Object 1.1

分组数据模型

Section 0
    [Managed Object 0.0, Managed Object 0.1, Managed Object 0.2]
    [Managed Object 1.0, Managed Object 1.1]

然后将此分组数据模型传递给super的dataModel属性设置器。表视图控制器只能看到分组数据模型。分段数据模型将完全位于GroupedIndexPathController的内部。如果获取结果发生变化,GroupedIndexPathController将通过controller:didUpdateDataModel:委托方法向分组数据模型报告更新,TLTableViewController将自动为您执行批量更新。

TLIndexPathTools提供了几个示例项目,Core Data example演示了如何与Core Data集成。您只需提供GroupedIndexPathController的实例,而不是标准TLIndexPathController

您提到您的表使用了部分。如果您可以详细说明,我可以修改上述内容以满足您的特定要求。