无法在NSManagedObject类'Item'上调用指定的初始值设定项

时间:2011-05-07 02:10:50

标签: objective-c core-data nsmanagedobject

我正在使用核心数据向模型添加/删除'Items'(NSManagedObject)。

但是,我收到标题中的错误:

代码: 无法在NSManagedObject类'Item'上调用指定的初始值设定项 如果你能告诉我哪里出错了,我真的很感激。我认为问题与初始化Item有关。

RootViewController.m

- (void)AddNew {
    CDManager *manager = [[CDManager alloc] initWithManagedObjectContext:[self managedObjectContext] andDelegate:self];
    [manager addNewObject:[Item itemWithDescription:@"testing" dateSet:[NSDate date] fullfillBy:[NSDate date]]];
    [manager release];
}

CDManager.m

- (id) initWithManagedObjectContext:(NSManagedObjectContext *)context andDelegate:(id<CDManagerDelegateProtocol>)delegate {
    if ((self = [super init])) {
        [self setDelegate:delegate];
        [self setContext:context];
        [self setItems:[[NSMutableArray alloc] init]];
        [self updateItems];
    }
    return self;
}

- (void)addNewObject:(Item *)item {
    NSManagedObjectContext *context = _context;
    Item *items = [NSEntityDescription
                            insertNewObjectForEntityForName:@"Item" 
                            inManagedObjectContext:_context];
    [items setDateSet:[item dateSet]];
    [items setDateToFullfill:[item dateToFullfill]];
    [items setItemDescription:[item itemDescription]];
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Couldn't save due to : %@", [error localizedDescription]);
    }
    [_delegate manager:self didAddNewItem:items];
    [self update];
}

Item.m

static Item *shared = nil;
@implementation Item
......

+ (Item *)itemWithDescription:(NSString *)d dateSet:(NSDate *)date fullfillBy:(NSDate *)dates {
    @synchronized(shared) {
        if (!shared || shared == NULL) {
            shared = [[Item alloc] init];
        }
        [shared setItemDescription:d];
        [shared setDateSet:date];
        [shared setDateToFullfill:dates];
        return shared;
    }
}

2 个答案:

答案 0 :(得分:2)

Item类被定义为单身。单例NSManagedObject子类没有规定。上下文不会理解如何处理它。

这段代码没什么意义。在这里初始化单个Item对象:

[manager addNewObject:[Item itemWithDescription:@"testing" dateSet:[NSDate date] fullfillBy:[NSDate date]]]

...但是在将其传递给addNewObject:方法之前,您不会将其附加到上下文中。反过来,该方法创建Item的另一个实例,然后使用假定的单例的值填充它。为什么?如果你的单例代码实际上有效,那么每次创建一个Item实例时,你都会得到相同的对象。创建对单例的另一个引用并将自己的值设置为自身的重点是什么。如果单例代码不起作用,为什么首先使用单例?

使用这样就是为什么单身人士有这么糟糕的代表。除非你有很多经验并且绝对需要,否则不要使用单身人士。此代码中没有任何内容表明您确实需要单例,而Core Data肯定不喜欢它们。

答案 1 :(得分:0)

也许你会做类似

的事情
Item * items = [[Item alloc]initWithEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]insertIntoManagedObjectContext:context];

编辑 -

因为您没有在自定义init方法中调用NSManaged对象的良好init方法。 你也可以清理那个以获取一个Context然后在超级那里调用initWithEntity ....