2011-05-07 47 views
1

我正在使用核心数据向模型添加/删除'Items'(NSManagedObject)。无法在NSManagedObject类'Item'上调用指定初始化程序

不过,我收到标题中的错误:

代码: 未能呼吁NSManagedObject类“项目” 我真的很感激,如果你能告诉我在哪里,我错了指定的初始化。我认为问题在于初始化项目。

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

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

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

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

...但你不将它传递给addNewObject:方法之前将其附加到上下文。反过来,该方法创建Item的另一个实例,然后用推测的单例的值填充它。为什么?如果你的单例代码实际上起作用了,每次你创建一个Item实例,你都会得到相同的对象。为单身人士创造另一个参考并为自己设定自己的价值观有什么意义?如果单例代码不起作用,为什么首先使用单例呢?

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

+0

我重写了initWithEntity ...方法,并删除了单例,它完美地工作。谢谢你的帮助。 – 2011-05-07 16:25:10

0

也许你做这样的事情

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

编辑 -

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

相关问题