-2

我刚刚开始使用 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 的关系,我不应该搞砸,或者这样的事情是否完全合法。谢谢!

4

1 回答 1

1

首先,您的 fetch 请求返回所有警报,而不仅仅是self.person. 您必须向 fetch 请求添加谓词:

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 的优点是,如果插入、删除或更新对象,表格视图会自动更新。

查看包含所有必需代码模板的文档NSFetchedResultsControllerNSFetchedResultsControllerDelegate

于 2013-01-27T09:20:52.767 回答