UIManagedDocument如何查找默认数据模型文件?

时间:2012-10-11 01:28:13

标签: objective-c ios xcode core-data

我一直关注CS193p关于Core数据的讲座,当我插入一个新的托管对象时,我遇到了一个问题。

错误是:

  

由于未捕获的异常终止应用'NSInternalInconsistencyException',原因:'+ entityForName:无法   在此模型中找到名为“Card”的实体。'

我在我的数据模型文件中创建了“Card”实体。但是我感觉它没有正确找到数据模型文件,因为一起删除该文件会产生相同的错误。我想知道如何判断是否由于UIManagedDocument对象未找到导致此错误的数据模型。

以下是我在控制器类中所做的事情:

NSURL *docURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *databaseURL = [docURL URLByAppendingPathComponent:@"Cards Database"];
self.cardsDatabase = [[UIManagedDocument alloc] initWithFileURL:databaseURL];

if (![[NSFileManager defaultManager] fileExistsAtPath:[self.cardsDatabase.fileURL path]]) {
    [self.cardsDatabase saveToURL:self.cardsDatabase.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
        NSLog(@"Done");
    }];
} else if (self.cardsDatabase.documentState == UIDocumentStateClosed) {
    NSLog(@"Closed");
    [self.cardsDatabase openWithCompletionHandler:^(BOOL success) {
        if (success) {
            NSLog(@"Opened");
            [self addSampleData];
        }
    }];
} else if (self.cardsDatabase.documentState == UIDocumentStateNormal) {
    NSLog(@"Normal");
}


- (void)addSampleData
{
    NSManagedObjectContext *context = self.cardsDatabase.managedObjectContext;

    [context performBlockAndWait:^{
        Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];

        card.title = @"Test Title";
    }];

    [self.cardsDatabase saveToURL:self.cardsDatabase.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success) {
        NSLog(@"Saved");
    }];
}

此行发生错误:

Card *card = [NSEntityDescription insertNewObjectForEntityForName:@"Card" inManagedObjectContext:context];

2 个答案:

答案 0 :(得分:1)

尝试重置模拟器(在设备中,删除应用程序),清理构建并再次运行。这应解决与“无法找到实体”相关的大多数问题。

答案 1 :(得分:1)

当您更新Core Data模型时,通过更改实体的属性名称,然后在不使用设备中的旧Core Data模型清除(删除)应用程序的情况下运行它,可能会发生此类问题。除非您计划使用轻型迁移或模型映射,否则请注意,每当您运行应用程序时都可能会发生这种情况