【问题标题】:How to sort based on count of sub-relationship in Core Data?如何根据 Core Data 中的子关系计数进行排序?
【发布时间】:2013-06-26 15:01:34
【问题描述】:

我有一个类似下面的模型:

我正在尝试查询所有喜欢某个 pageId 上的帖子的用户。我只想在 User.liked 中返回与给定 pageId 匹配的帖子。此外,我希望它按 User.liked 的计数排序。

我可以一次性完成这一切吗?

到目前为止我的代码:

NSFetchRequest* userFetch = [NSFetchRequest fetchRequestWithEntityName:@"User"];

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(liked, $x, $x.page.pageId = %@).@count > 0)", self.pageId];
[userFetch setPredicate:predicate];

NSArray *allUsers = [_document.managedObjectContext executeFetchRequest:userFetch error:nil];

这正确地只给了我在页面上至少有一个喜欢的用户对象,但可能包括来自 User.liked 中其他页面的帖子。此外,它没有排序。

我可以通过这样做对获取后进行排序:

_users = [allUsers mutableCopy];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"liked.@count" ascending:NO];
_users = [[_users sortedArrayUsingDescriptors:@[sortDescriptor]] mutableCopy];

但这一切都慢了下来。如果无法在 fetch 中进行排序,如何加快排序后获取?

我是 CoreData 新手,当我遇到这种情况时,我通常只是完全放弃 CoreData 并通过将我的 NSObjects 序列化到磁盘来开始管理数据。在我这样做之前有什么提示吗?

谢谢!

【问题讨论】:

    标签: iphone ios core-data


    【解决方案1】:

    据我所知,在子查询中您应该使用 '==' 而不是 '=' 所以您可以尝试使用子查询:

    @"(SUBQUERY(liked, $x, $x.page.pageId == %@).@count > 0)"
    

    这可能会解决部分but might include Posts from other Pages in User.liked

    已编辑

    【讨论】:

    • 不幸的是,您不能将 @ 语法排序与一对多关系一起使用。 :(
    • 另外,据我所知,SUBQUERY 只是评估真/假,不是吗?所以基本上,它要么返回 User 对象,要么不返回。它不会过滤它。另外,我认为 '=' 无论如何都会扩展为 '=='。
    • 试试看这个话题stackoverflow.com/questions/6890079/subquery-in-core-data 尤其是看cmets的唯一答案。在我看来,除了需要进行排序之外,几乎是你的情况
    • 关于排序你是对的,你不能在 fetch 的时候做。我删除了答案的第二部分,以免混淆其他人。为了使事后排序更快,您可以尝试查看排序和过滤 NSArray 对象:developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多