19

我昨天刚开始使用 CoreData,我快疯了 :( 我创建了一个使用 CoreData 的项目(勾选框 - 使用 CoreData)。创建实体,然后为所有实体创建 NSManagedObject 类(我想他们创建实体的 'setter' 和 'getter' 方法)。

现在,我在我的 AppDeletegate 中 #imported 所有这些类,并在我的 applicationDidFinishLaunching 方法中写了这个:

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

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:]:无法识别的选择器发送到实例 0x6160550

我不知道为什么会这样。请帮忙!!!在此先感谢大家!

添加 Subscriptions
Subscriptions.h的标头

@interface Subscriptions : NSManagedObject {
}
@property (nonatomic, retain) NSString * Type;
@property(非原子,保留)NSDecimalNumber * 读取;
@property (nonatomic, 保留) NSString * Title;
@property(非原子,保留)NSString * 代码;
@property(非原子,保留)NSDecimalNumber * 新;
@结尾

我没有改变任何东西。就像 Xcode 创建它一样。

4

8 回答 8

33

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

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

并且不要忘记在数据模型中设置类名:

在此处输入图像描述

于 2011-01-16T15:47:50.533 回答
12

我得到了这个,并对项目进行了清理并修复了它。

于 2012-04-12T18:09:56.697 回答
4

我向 Core Data 实体添加了一个属性,而不是重新创建 NSManagedObjectSubclass,我尝试花哨并手动将 @property 和 @dynamic 添加到现有子类中。

那没有用,所以我去通过 XCode 重新创建了子类,这就是我开始收到此错误的时候(设置属性值时“无法识别的选择器发送到实例”)。

所以我通过 XCode 创建了一个新版本的 Core Data Model,然后清理、删除了派生数据,然后重新创建了 NSManagedObject 子类。那行得通。

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

于 2013-02-07T18:48:21.740 回答
3

两个可能的问题

这些属性的 .m 文件中是否有相应的 @dynamic 块?

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

@property (nonatomic, retain) NSString * type;在.h

@dynamic type;

变成类似的东西

-(void)setType:(NSString *)atype
{
....
[self willChangeValueForKey:@"type"];
[self setPrimitiveValue:atype forKey:@"type"];
[self didChangeValueForKey:@"type"];
} 

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

在后台。尽管您永远看不到该代码。

大小写约定由您决定,但 Camel Caps 在名义上与 Cocoa 一起使用是正常的。但它更像是一个对象,例如Big Furry Catbecome bigFurryCat。遵循苹果示例中的风格。

编辑- 将 @synthesize 更改为 @dynamic

于 2010-12-28T16:00:43.980 回答
2

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

在此处输入图像描述

于 2012-06-16T13:23:45.520 回答
0

我有同样的问题,我找到了一个不太优雅的解决方案。看起来

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

创建myEntity不具有最新版本属性的旧版本。所以我把myEntity旧版本模型中的名字改成了myEntityOld,再也没报错。

NSManagedObject我怀疑通过设置or的属性在 XCode 中有一种优雅的方式来做同样的事情NSEntityDescription

于 2012-07-13T23:22:59.077 回答
0

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

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

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

希望有所帮助

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

于 2010-12-28T13:41:20.230 回答
0

采取以下步骤

1) 通过 Xcode 创建了一个新版本的 Core Data Model。

2)修复关系(增加了两者之间的新关系。)

创建托管对象关系

3) 重新创建了 NSManagedObject 子类

于 2016-06-07T12:04:07.797 回答