2012-10-11 31 views
2

我一直在关注CS193p关于核心数据的讲座,当我插入一个新的托管对象时,我遇到了一个问题。UIManagedDocument如何找到默认的数据模型文件?

的错误是:

终止应用程序由于未捕获的异常'NSInternalInconsistencyException',原因是: '+ entityForName:无法 找到名为实体'。在这个模型中' 卡

我在我的数据模型文件中创建了“卡”实体。不过,我有一种感觉,它不正确地找到数据模型文件,因为一起删除该文件给出相同的错误。我想知道我是如何找出是否由于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]; 

回答

1

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

+0

您是对的。我做了一个模拟器内容重置后工作。我之前尝试过清洗,但没有工作,但是这绝对解决了这个问题。干杯! – redshift5

1

当您更新Core Data模型时,可能会发生这种问题,方法是更改​​实体属性的名称,然后使用设备中较旧的Core Data模型清理(删除)应用程序,然后运行它。除非您打算使用轻量级迁移或模型映射,否则请注意,每当您运行应用程序时可能会发生这种情况。