关于iphone:CoreData问题: – [NSManagedObject setValue:]:发送到实例的无法识别的选择器

CoreData issue: -[NSManagedObject setValue:]: unrecognized selector sent to instance

我昨天刚开始使用coredata,我疯了:(我创建了一个使用coredata的项目(勾选了框-使用coredata)。创建实体,然后为所有实体创建nsmanagedObject类(我认为它们为实体创建了"setter"和"getter"方法)。

现在,我在AppDeleteGate中导入了所有这些类,并在ApplicationDidFinishLaunching方法中编写了这些类:

(订阅是应用程序中的实体之一)

1
2
3
4
5
6
7
8
9
10
NSManagedObjectContext *context = [self managedObjectContext];
 Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
 [sbs setTitle:@"OK"];
 [sbs setType:@"Tag"];
 [sbs setCode:@"cars"];

 NSError *error = nil;
 if (![context save:&error]) {
  NSLog(@"Couldn't create the subscription");
 }

当我运行这个时,我得到这个错误

[NSManagedObject setTitle:]: unrecognized selector sent to instance 0x6160550

我不知道为什么会这样。请帮助!!!!提前感谢大家!

添加订阅头
订阅.h

@interface Subscriptions : NSManagedObject {
}
@property (nonatomic, retain) NSString * Type;
@property (nonatomic, retain) NSDecimalNumber * Read;
@property (nonatomic, retain) NSString * Title;
@property (nonatomic, retain) NSString * Code;
@property (nonatomic, retain) NSDecimalNumber * New;
@end

我什么都没改变。就像Xcode创建的那样。


只是提醒一下,不要使用大写的变量名,它可能会影响getter和setter工作不正常。

如果您从数据模型生成了nsmanagedObject子类,那么一切都应该正常,尽管它是@dynamic的,setter是由coredata实现的,并且因为它们已经实现了,所以您不应该将其更改为合成。至少对我来说,coredata在我将@dynamic更改为@synthesis之后返回空对象。

别忘了在数据模型中设置类名:

enter image description here


我得到了这个,对这个项目做了一个清理,它修复了它。


我向一个核心数据实体添加了一个ATirbute,而不是重新创建nsmanagedObjectSubclass,我试图得到幻想,并手动将@property和@dynamic添加到现有的子类中。

这不起作用,所以我通过xcode重新创建了子类,这是我开始犯这个错误的时候("为属性设置值时,将无法识别的选择器发送到实例")。

因此,我通过Xcode创建了核心数据模型的新版本,然后清理、删除派生数据,然后重新创建nsmanagedObject子类。效果不错。

它可能正在创建一个新的数据模型和基于该模型的新子类,所以我可能不需要清理或删除派生的数据……但它也没有损害!


两个可能的问题

在.m文件中是否有对应的@dynamic块用于这些属性和

不要使用大写的属性,编码约定是属性对于第一个字母是小写的,至少这样当编译器合成方法时。

@property (nonatomic, retain) NSString * type;英寸高

@dynamic type;英寸米

变得像

1
2
3
4
5
6
7
8
9
10
11
12
-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
}

-(NSString *)type
{
return [self primitiveValueForKey:@"type"];
}

在背景中。尽管你看不到代码。

案件惯例由你决定,但骆驼帽在名义上与可可是正常的。但它很像一个物体,如Big Furry Cat变成bigFurryCat。遵循苹果示例中的样式。

编辑-将@synthesis更改为@dynamic


我发现,通过与实体建立关系,我必须确保我的一些关系与许多实体建立关系,我截取了一个屏幕截图,这样你就能明白我的意思,一对多的关系是由双端箭头表示的。

enter image description here


采取以下步骤

1)通过xcode创建了核心数据模型的新版本。

2)修复关系(添加新的关系)。)

创建托管对象关系

3)重新创建nsmanagedObject子类


我也遇到了同样的问题,我找到了一个不那么优雅的解决方案。似乎

1
[NSEntityDescription insertNewObjectForEntityForName:@"myEntity" inManagedObjectContext:myManagedObjectContext];

创建一个旧版本的myEntity,它没有最新版本的属性。所以我把旧版本的模型中的myEntity的名称改为myEntityOld,我再也没有得到错误。

我怀疑在Xcode中,通过设置NSManagedObjectNSEntityDescription的属性,有一种优雅的方法可以做同样的事情。


在我看来,标题属性不能设置为字符串。你查过了吗?

通常,发送到实例的无法识别的选择器是一个运行时错误,因为它向对象发送了一个对象不知道如何处理的消息。

1
2
Subscriptions *sbs = (Subscriptions *)[NSEntityDescription insertNewObjectForEntityForName:@"Subscriptions" inManagedObjectContext:context];
sbs.Title = @"OK";

希望帮助

我在这里做了一个简单的项目。