将排序的 NSManagedObjects 重新分配给 NSSet
Posted
技术标签:
【中文标题】将排序的 NSManagedObjects 重新分配给 NSSet【英文标题】:Reassigning sorted NSManagedObjects to the NSSet 【发布时间】:2013-01-27 06:09:57 【问题描述】:我刚刚开始使用 Core Data,但不确定它是如何工作的。我基本上有一个人实体和一个警报实体。每个人可以有许多警报。我想要的是去 person 对象的 detailViewController 并查看他们的警报。因为 NSSet 没有排序,所以我有一个方法可以返回这样排序的警报:
- (NSArray *)sortedTimes
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Alarm" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *timeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"time" ascending:YES selector:@selector(compare:)];
[request setSortDescriptors:@[timeDescriptor]];
NSError *error = nil;
NSArray *objects = [self.managedObjectContext executeFetchRequest:request error:&error];
// Can I do this???
//self.person.alarms = [NSSet setWithArray:objects];
// for (NSManagedObject *obj in objects)
// NSDate *date = [obj valueForKey:@"time"];
// NSLog(@"date: %@", [date description]);
//
return objects;
我想知道的是,在self.person.alarms = [NSSet setWithArray:objects];
行中可以吗?我想我不确定到底发生了什么。我的 executeFetchRequest 返回我想要的对象数组。我可以继续将其分配给人员实体的警报属性吗?我不确定是否有来自 Person->Alarm 的关系,我不应该搞砸,或者这样的事情是否完全合法。谢谢!
【问题讨论】:
【参考方案1】:首先,您的获取请求返回所有个警报,而不仅仅是self.person
的警报。您必须在获取请求中添加谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"person = %@", self.person];
[request setPredicate:predicate];
(假设person
是从Alarm 实体到Person 实体的反向关系)。但是你并不真的需要一个获取请求来获取一个人的排序警报。更直接的方法是
NSArray *objects = [[self.person.alarms allObjects]
sortedArrayUsingDescriptors:@[timeDescriptor]];
现在回答你的问题:声明
self.person.alarms = [NSSet setWithArray:objects];
只需将同一组警报重新分配给此人。这实际上不会改变任何东西,因为它是同一个集合。特别是,它不保证self.person.alarms
现在会按时间排序。
备注: 如果您想显示一个带有人员警报的表格视图,您也可以使用NSFetchedResultsController
(FRC) 作为表格视图数据源。使用 FRC 的优点是,如果插入、删除或更新对象,表格视图会自动更新。
查看包含所有必需代码模板的 NSFetchedResultsController
和 NSFetchedResultsControllerDelegate
文档。
【讨论】:
以上是关于将排序的 NSManagedObjects 重新分配给 NSSet的主要内容,如果未能解决你的问题,请参考以下文章
使用 setPropertiesToFetch 时将数据保存在 NSManagedObjects
如何将其他 NSManagedObjects 存储为 NSManagedObject 的属性
Objective-C 将 XML 解析为 NSManagedObjects