12

我正在使用谓词在我的应用程序NSFetchedResultsController中加载列表。Documents我想加载Documents除当前活动之外的所有内容。

我正在使用 Rentzsch 的MOGenerator创建一个_Document类,然后将所有自定义代码放入Document子类中。_Document生成objectID类型为 的属性DocumentID

在创建控制器的类中,我设置了控制器的currentDocID属性:

controller.currentDocID = self.document.objectID;

在控制器本身中,我像这样延迟加载 fetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController {
    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

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

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(objectID != %@)", self.currentDocID];
    [fetchRequest setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dateModified" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

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

    [aFetchedResultsController release];
    [sortDescriptor release];
    [sortDescriptors release];

    return fetchedResultsController;
}

当 fetchedResultsController 加载时,我的应用程序因未处理的异常而崩溃:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath objectID not found in entity <NSSQLEntity Document id=1>'

据我了解,所有 NSManagedObjects 都有一个 objectID,无论是临时的还是永久的。不是这样吗?有什么想法吗?

4

1 回答 1

10

将谓词更改为阅读

[NSPredicate predicateWithFormat:@"self != %@", [self currentDoc]]

wherecurrentDoc是对NSManagedObject表示当前文档的实例的引用。

Core Data 将在内部进行相等性检查。

于 2010-03-22T16:52:55.540 回答