创建 NSManagedObject 派生类的问题

Posted

技术标签:

【中文标题】创建 NSManagedObject 派生类的问题【英文标题】:Problem creating NSManagedObject derived class 【发布时间】:2011-03-08 10:13:15 【问题描述】:

我在这里做错了...我知道

我正在使用 Xcode,并使用数据建模器创建了以下类:

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


@interface Project : NSManagedObject 
@private

@property (nonatomic, retain) NSNumber * indent;
@property (nonatomic, retain) NSNumber * collapsed;
@property (nonatomic, retain) NSString * color;
@property (nonatomic, retain) NSNumber * project_id;
@property (nonatomic, retain) NSNumber * item_order;
@property (nonatomic, retain) NSNumber * cache_count;
@property (nonatomic, retain) NSNumber * user_id;
@property (nonatomic, retain) NSString * name;

@end

当我尝试使用以下代码使用来自 JSON 源的数据传播此类时:

NSString* filePath = [[NSBundle mainBundle] pathForResource:@"projects" ofType:@"json"];

if (filePath) 
    NSString* jsonString = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
    DLog(@"JSON for Projects:%@", jsonString);
    SBJsonParser* jsonParser = [SBJsonParser new];
    id response = [jsonParser objectWithString:jsonString];
    NSArray* array = (NSArray*) response;
    NSEnumerator* e = [array objectEnumerator];
    NSDictionary* dictionary;
    while ((dictionary = (NSDictionary*)[e nextObject])) 

        Project* project = [[Project alloc] init];
        project.user_id = [dictionary objectForKey:@"user_id"];
        project.name = [dictionary objectForKey:@"name"];
        project.color = [dictionary objectForKey:@"color"];
        project.collapsed = [dictionary objectForKey:@"collapsed"];
        project.item_order = [dictionary objectForKey:@"item_order"];
        project.cache_count = [dictionary objectForKey:@"cache_count"];
        project.indent = [dictionary objectForKey:@"indent"];
        project.project_id = [dictionary objectForKey:@"project_id"];

        [elementArray addObject:project];

        [project release];
    

但是,代码在project.user_id = [dictionary objectForKey:@"user_id"]; 行停止,并出现异常“* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Project setUser_id:]: unrecognized selector sent to实例 0x590bcb0'"

我不知道为什么会发生这种情况或如何解决。

【问题讨论】:

【参考方案1】:

我已经设置了一个现实扭曲场,所以我不会违反我的 NDA。现在我可以回答你的问题了,这与无论如何不能命名的产品无关。


有你的错误:Project* project = [[Project alloc] init];

如果您以这种方式创建对象,则不会为您创建 @dynamic setter 和 getter。 没有 NSManagedObjectContext 就不能使用 NSManagedObjects。

你应该使用这样的东西:

Project *project = (Project *)[NSEntityDescription insertNewObjectForEntityForName:@"Project" inManagedObjectContext:self.managedObjectContext];

【讨论】:

【参考方案2】:

带下划线的属性名称在 Objective C 世界中不是很明智——我猜 Core Data 生成的属性因此有错误的名称。尝试使用 CamelCase,即调用您的属性 userIDitemOrdercacheCount 等。

【讨论】:

【参考方案3】:

您可能需要设置 getter 和 setter。

它可以像添加一样简单: @synthesize user_id;

在你的类文件中。

【讨论】:

错了。 Core Data 属性在运行时自动生成。 第一行是正确的。但并不是说他忘记了@synthesize。更多的是他的@dynamic 访问器没有被创建。

以上是关于创建 NSManagedObject 派生类的问题的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用其基类构造函数创建派生类的指针而不修改派生类的布局?

如果派生类作为基类返回,如何访问派生类的方法?

“NSManagedObject”类的 NSManagedObject 必须具有有效的 NSEntityDescription

如何从指向多态基类的指针复制/创建派生类实例?

根据参数创建派生类的新实例

派生类的构造函数