我刚刚开始使用Core Data,我不确定这是如何工作的。我基本上有一个Person实体和一个警报实体。每个人都可以有很多闹钟。我想要的是转到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之间的关系,我不应该捣乱,或者这样的事情是否完全合法。谢谢!
答案 0 :(得分: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
文档。