我收到了这个经典错误:
用于打开商店的模型与用于创建商店的模型不兼容
这就是它的实施方式:
NSManagedObjectContext *context = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
NSManagedObject *newShot = [NSEntityDescription insertNewObjectForEntityForName:@"shotName" inManagedObjectContext:context];
NSString *newName= @"test";
[newShot setName:newName];
这就是它的设计方式:
不仅我上面的消息崩溃了,我也收到了这个警告:
'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'
答案 0 :(得分:1)
使用setValue:forKey:
<强>更新强>
NSManagedObjectContext
有save
方法,而不是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;又跑了。