创建NSManagedObject派生类时出现问题

时间:2011-03-08 10:13:16

标签: objective-c json core-data

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

我正在使用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"];行停止,但由于未捕获的异常“NSInvalidArgumentException”,“ * 终止应用程序”,原因:' - [Project setUser_id:]:无法识别的选择器发送到实例0x590bcb0'“

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

3 个答案:

答案 0 :(得分:2)

我设置了一个真实失真字段,所以我没有违反我的NDA。现在我可以回答你的问题了,它与产品无关 - 无论如何都不能命名。


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

如果您以这种方式创建对象,则不会为您创建@dynamic设置器和getter 如果没有NSManagedObjectContext,则无法使用NSManagedObjects。

你应该使用这样的东西:

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

答案 1 :(得分:0)

带有下划线的属性名称在Objective C世界中不是很明智 - 我猜核心数据生成的属性因此具有错误的名称。尝试使用CamelCase,即调用您的媒体资源userIDitemOrdercacheCount等。

答案 2 :(得分:-1)

您可能需要设置您的getter和setter。

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

在您的班级文件中。