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