首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >核心数据:跨关系计数

核心数据:跨关系计数
EN

Stack Overflow用户
提问于 2010-12-22 22:29:25
回答 2查看 512关注 0票数 2

我有三个模特:

代码语言:javascript
运行
复制
+----------+        +--------------+        +------+
| Occasion | <--->> | GiftOccasion | <--->> | Gift |
+----------+        +--------------+        +------+

我想知道这个场合的名称,以及所有符合特定标准的礼物的数量。目前,我得到了按年份和名称排序的不同场合列表:

代码语言:javascript
运行
复制
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request retain];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Occasion" inManagedObjectContext:[self managedObjectContext]];
[request setEntity:entity];
[request setResultType:NSDictionaryResultType];

[request setPropertiesToFetch:[NSArray arrayWithObjects:@"name", @"year", nil]];    
[request setReturnsDistinctResults:YES];

NSSortDescriptor *yearDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"year" ascending:NO selector: @selector(caseInsensitiveCompare:)] autorelease];
NSSortDescriptor *nameDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector: @selector(caseInsensitiveCompare:)] autorelease];
NSArray *descriptors = [NSArray arrayWithObjects:yearDescriptor, nameDescriptor, nil];
[request setSortDescriptors:descriptors];

NSError *error = nil;
NSArray *results = [[self managedObjectContext] executeFetchRequest:request error:&error];  

..。但是我完全搞不懂如何计算Gift的数量。是否有一种简单的方法,或者我是否需要遍历每个GiftOccasion和相关的Gift,并将其全部添加到一起?

ETA:请注意,我是生成了不同的结果--,在这里,不是直接得到模型。我想我需要运行另一个请求来获取这个信息,但是如果可能的话,那就更好了。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2010-12-23 01:15:08

Stack Overflow用户

发布于 2010-12-23 21:37:01

这不是一个好答案,我也不会选择它作为“正确”答案,但我最后做的是一组荒谬的嵌套NSEnumerator,它们贯穿每个关系,并最终执行一个count += 1;,类似于这样:

代码语言:javascript
运行
复制
    NSUInteger giftCount = 0;


    NSEnumerator *oEnum = [resultsList objectEnumerator];
    Occasion *occasion = nil;
    while (occasion = [oEnum nextObject]) {

        NSEnumerator *goEnum = [occasion.giftOccasions objectEnumerator];
        GiftOccasion *go;

        while (go = [goEnum nextObject]) {
            if (go.gifts) {

                NSEnumerator *giftEnum = [go.gifts objectEnumerator];
                Gift *gift = nil;
                while (gift = [giftEnum nextObject]) {
                    NSLog(@"Gift: %@ %@", gift.name, gift.purchased);
                    if ([gift.purchased boolValue] == NO) {
                        giftCount += 1;
                    }
                }
            }
        }
    }

很尴尬,但很管用。:-)

如果有更好、更有效的方法来做这件事,我很想听听。这是我不喜欢核心数据作为一个ORM的事情之一,比如说,ActiveRecord。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4514301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档