【问题标题】:How to sort child nodes in Core Data?如何对 Core Data 中的子节点进行排序?
【发布时间】:2014-01-28 13:58:14
【问题描述】:

我在 CoreData 中有一个名为 TreeNode 的实体。 它有一个属性日期作为字符串类型。 它具有父关系(一对一)和子关系(一对多)。
它有一个名为 rootNodes 的 fetch 方法。

如何在 Core Data 中对子节点进行排序? (排序年月日) 非常感谢。

- (NSArray *)rootNodes {

     NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"date"   ascending:YES];
     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent == nil];
     NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"TreeNode"];
    [request setSortDescriptors:@[sort]];
    [request setPredicate:predicate];

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

    if (error)
        NSAssert1(error == nil, @"%s Error occurred!", __func__);

    return objects;
}



superNode(2013-Year)
 |
 +--->subNode(09-Month)
 |
 +--->subNode(01-Month)
 |     +--->subNode(10-Day)
 |     +--->subNode(04-Day)
 |     +--->subNode(03-Day)
 |
 +--->subNode(06-Month)
 |     +--->subNode(18-Day)
 |     +--->subNode(01-Day)
 |     +--->subNode(22-Day)
 |     +--->subNode(02-Day)

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

    简短的回答是您不能(轻松)这样做,因为您将日期存储为字符串。如果您将日期存储为日期,那么您现有的代码将起作用。

    您也许可以使用一些巧妙的子类化和便利方法使其工作。但首先你需要向我展示 Xcode 中的真实数据模型、屏幕截图等就可以了。你画它的方式没有多大意义。

    一旦您发布模型,我将使用我的子类化建议更新此答案。

    更新 1

    该字符串中存储的内容。是否实际上只是顶层的年份,下一层的月份,最后一层的天?在教室示例之外,这是一个非常奇怪的设计......

    如果数据确实采用这种格式并且单个数字以零开头,那么您在上面定义的排序将适用于顶级(年份)节点。然后你可以创建一个排序方便的方法来返回子节点:

    - (NSArray*)sortedSubNodes
    {
        NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:YES];
        NSSet *subNodes = [self valueForKey:@"children"];
        NSArray *sortedNodes = [subNodes sortedArrayUsingDescriptors:@[sortDescriptor]];
        return sortedNodes;
    }
    

    将该方法放在您的NSManagedObject 子类中,在模型中声明子类,然后您可以从年份中按顺序获取月份,并从月份中按顺序获取日期。

    【讨论】:

    • 大师您好,感谢您的提前。如何将日期类型从 sting 更改为数字或日期(NSDate)?
    • “自参考日期以来的秒数”存储为日期数字,便于排序(和查询)。
    猜你喜欢
    • 2012-06-18
    • 2018-11-28
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    相关资源
    最近更新 更多