经典CoreData错误

时间:2010-09-25 19:35:28

标签: iphone objective-c

我收到了这个经典错误:

用于打开商店的模型与用于创建商店的模型不兼容

这就是它的实施方式:

 NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

 NSManagedObject *newShot = [NSEntityDescription insertNewObjectForEntityForName:@"shotName" inManagedObjectContext:context];

NSString *newName= @"test"; 
 [newShot setName:newName];

这就是它的设计方式:

alt text alt text

不仅我上面的消息崩溃了,我也收到了这个警告:

'NSManagedObject'可能无法响应'-setName:'

显然某处出了问题,我想我两边都在使用Strings。


编辑,我现在在Eimantas的评论之后使用它:

 NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
 NSManagedObject *newShot = [NSEntityDescription insertNewObjectForEntityForName:@"shotName" inManagedObjectContext:context];
 NSString *newName= @"test"; 
 [newShot setValue:newName forKey:@"shotNumber"]; 
 [context saveAction];

但我还是得到了:

'NSManagedObjectContext'可能无法响应'-saveAction'

2 个答案:

答案 0 :(得分:1)

使用setValue:forKey:

<强>更新

NSManagedObjectContextsave方法,而不是saveAction。所以:

NSError *error = nil;
[context save:&error]
if (error) {
  [NSApp presentError:error];
  return;
}

答案 1 :(得分:1)

insertNewObjectForEntityForName:@"shotName"必须为insertNewObjectForEntityForName:@"Shots"Shots是实体名称。 shotName是实体Shots的属性的名称。此外,与Objective-C类名称一样,为实体对象使用单数名称是标准的。因此,Shots应为Shot(推荐,但不是必需的)。

另外,如果您更改了AppName.xcdatamodel文件&amp;生成新的NSManagedObject文件时,您可能还会收到错误:用于打开商店的模型与应用启动时用于创建商店的模型不兼容。这是因为它使用的是旧的持久性存储文件。我称之为AppName.sqlite,但您可能对此文件使用了不同的名称。在您的项目中搜索类似的内容:

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"AppName.sqlite"]];

然后,一旦知道名称,找到该文件,执行:

find ~/Library/Application\ Support/ -name AppName.sqlite

然后,删除该文件,并构建&amp;又跑了。