【问题标题】:Core Data: Keypath "objectID" not found in entity核心数据:实体中找不到键路径“objectID”
【发布时间】:2011-01-30 09:20:59
【问题描述】:

我正在使用带有谓词的NSFetchedResultsController 在我的应用程序中加载Documents 的列表。我想加载除当前活动的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,无论是临时的还是永久的。不是这样吗?有什么想法吗?

【问题讨论】:

    标签: iphone objective-c cocoa core-data nsfetchedresultscontroller


    【解决方案1】:

    将谓词更改为阅读

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

    其中currentDoc 是对代表当前文档的NSManagedObject 实例的引用。

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

    【讨论】:

    • 你知道为什么...@"self != %@", [self currentDoc]]...@"(objectID != %@)", self.currentDocID]不一样吗?根据这篇帖子stackoverflow.com/a/2306550/647644 应该是等价的。
    猜你喜欢
    • 2011-04-12
    • 2015-08-18
    • 1970-01-01
    • 2021-10-19
    • 2011-07-08
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-11-06
    相关资源
    最近更新 更多