CoreData 通过 NSNumber 属性制作部分不正确

Posted

技术标签:

【中文标题】CoreData 通过 NSNumber 属性制作部分不正确【英文标题】:CoreData make sections by NSNumber property works not correct 【发布时间】:2015-03-18 08:06:29 【问题描述】:

我在我的项目中使用 CoreData fetchedResultsController。我想通过isDone 属性对我的Event : NSManagedObject 仅两个部分进行排序,这实际上是一个BOOL 值。当我添加 NSManagedObject 子类时,我没有选中“对原始数据类型使用标量属性”。所以它是NSNumber 类型

问题是部分名称和编号是否正确。但是“0”部分中的事件并不全是isDone = FALSE,而“1”部分也不全是'isDone=YES',那么这可能是我的代码有什么问题吗?

Event.h

@interface Event : NSManagedObject
@property (nonatomic, retain) NSDate * endDate;
@property (nonatomic, retain) NSNumber * isDone;
@property (nonatomic, retain) NSString * name;
end

初始化 NSFetchedResultsController

- (NSFetchedResultsController *)fetchedResultsController 

    if (_fetchedResultsController != nil) 
        return _fetchedResultsController;
    

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Event" inManagedObjectContext:[self managedObjectContext]];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"endDate" ascending:YES];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:[self managedObjectContext] sectionNameKeyPath:@"isDone"
                                                   cacheName:nil];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;


有什么帮助吗?谢谢!

-------------编辑------------------------

NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"endDate" ascending:YES];
    NSSortDescriptor *sort1 = [[NSSortDescriptor alloc]
                              initWithKey:@"isDone" ascending:YES];
    [fetchRequest setSortDescriptors:@[sort1,sort]];

【问题讨论】:

您需要您的排序描述符与您的 sectionName 相匹配。使用isCountdown 作为键添加另一个 sortDescriptor,并将其作为第一项包含在 sortDescriptors 数组中。您还使用isCountdown 作为您的sectionNameKeyPath,但使用isDone 作为属性名称 - 这些是否相关? 嘿,谢谢!它在我编辑时工作。我只是以为sectionNameKeyPath已经排序完毕,然后按“endDate”排序。 您应该将其移至答案,而不是将该代码添加到问题中。它回答了问题,所以它应该是一个答案。 当我尝试回答自己的问题时,*** 会弹出提示“编辑”或“评论”。我应该回答我自己的问题吗? 是的,您的代码实际上回答了这个问题。这不是对问题或评论的补充。 【参考方案1】:

在@pbasdf 的帮助下,我将代码更改为以下。我理解 set sectionNameKeyPath aleady 时进行排序,但实际上不是。您也可以查看ios DEV CENTER sample code。希望对某人有所帮助。

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"endDate" ascending:YES];
    NSSortDescriptor *sort1 = [[NSSortDescriptor alloc]
                              initWithKey:@"isDone" ascending:YES];
    [fetchRequest setSortDescriptors:@[sort1,sort]];

【讨论】:

以上是关于CoreData 通过 NSNumber 属性制作部分不正确的主要内容,如果未能解决你的问题,请参考以下文章

在 CoreData 实体中将属性从 NSNumber 转换为 NSString - LightWeightMigration

NSNumber 类型的托管属性?未初始化为零

将核心数据中的 NSNumber 转换为 NSString

无法将 NSNumber 存储在核心数据中

核心数据问题 - 无法存储 NSNumber

将 NSNumber* 的 NSArray 存储为 Core Data 中的 NSString