CoreData - insertNewObjectForEntityForName无法设置属性

时间:2013-03-29 16:00:24

标签: ios objective-c core-data runtime-error

我正在使用CoreData为该实体提供一个实体和两个属性 实体:Binder
属性:名称,lastOpened
,br> 我能够毫无问题地插入实体的新对象,我也可以设置它的名称,但是我无法设置它的lastOpened属性。
这是我的代码:

Binder *newBinder = [NSEntityDescription insertNewObjectForEntityForName:@"Binder" inManagedObjectContext:context];
[newBinder setName:@"Binder"];
[newBinder setLastOpened:[NSDate date]]; //Tried this first
newBinder.lastOpened = [NSDate date]; //No compiler warning either

然而,当我运行应用程序时,我收到-[Binder setLastOpened:]: unrecognized selector sent to instance 0x9688870

的错误 我可以验证显示的内存地址实际上是正确的Binder对象。任何想法为什么我可以设置一个属性而不是另一个属性?谢谢。
Binder.h:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Cards;

@interface Binder : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSDate * lastOpened;
@property (nonatomic, retain) NSSet *cards;
@end

@interface Binder (CoreDataGeneratedAccessors)

- (void)addCardsObject:(Cards *)value;
- (void)removeCardsObject:(Cards *)value;
- (void)addCards:(NSSet *)values;
- (void)removeCards:(NSSet *)values;

@end

Binder.m:

#import "Binder.h"
#import "Cards.h"


@implementation Binder

@dynamic name;
@dynamic lastOpened;
@dynamic cards;

@end

3 个答案:

答案 0 :(得分:1)

Xcode偶尔会重建对xcdatamodel的更改。下次,尝试做一个干净的构建。

另外,你不应该硬编别类名字符串,因为它会破坏重构。

[NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Binder class]) inManagedObjectContext:context]

此外,为类名和托管对象添加前缀。 (例如,喜欢XYZBinder只是Binder)。您将避免将来对命名空间冲突感到悲伤。

答案 1 :(得分:0)

您可能已在项目中加载了另一个名为Binder的类。尝试将CoreData实体的类名设置为类似于XCode中的BinderMO并重新创建类文件。

答案 2 :(得分:0)

我不确定问题是什么,但我删除了我的Binder.h / .m文件并重新创建它们,现在它可以工作了。旧的和新的之间的唯一区别是&#39; name&#39;并且&#39; lastOpened&#39;转换的地方。谢谢你的帮助。

New Binder.h:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>

@class Cards;

@interface Binder : NSManagedObject

@property (nonatomic, retain) NSDate * lastOpened;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *cards;
@end

@interface Binder (CoreDataGeneratedAccessors)

- (void)addCardsObject:(Cards *)value;
- (void)removeCardsObject:(Cards *)value;
- (void)addCards:(NSSet *)values;
- (void)removeCards:(NSSet *)values;

@end

New Binder.m:

#import "Binder.h"
#import "Cards.h"


@implementation Binder

@dynamic lastOpened;
@dynamic name;
@dynamic cards;

@end