Не удалось вызвать назначенный инициализатор для класса NSManagedObject 'Item' - PullRequest
1 голос
/ 07 мая 2011

Я использую данные ядра для добавления / удаления «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 ]

2 голосов
/ 07 мая 2011

Класс Item определяется как одноэлементный. Не предусмотрено одноэлементных подклассов NSManagedObject. Контекст не поймет, как с этим справиться.

Этот код имеет мало смысла. Здесь вы инициализируете одиночный объект Item:

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

... но вы не присоединяете его к контексту перед передачей его методу addNewObject:. В свою очередь этот метод создает другой экземпляр Item, а затем заполняет его значениями предполагаемого синглтона. Зачем? Если ваш одноэлементный код действительно работает, каждый раз, когда вы создаете экземпляр Item, вы получаете один и тот же объект обратно. Какой смысл создавать еще одну ссылку на синглтон и устанавливать свои собственные значения для себя. Если синглтон-код не работает, зачем вообще использовать синглтон?

Использует именно так, поэтому у синглетонов такой плохой представитель. Не используйте синглтоны, если у вас нет большого опыта работы с ними, и они абсолютно необходимы. В этом коде нет ничего, что указывало бы на то, что вам нужен синглтон, и Core Data определенно не нравится им.

0 голосов
/ 07 мая 2011

Может быть, вы делаете что-то вроде

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

Редактировать -

потому что вы не вызываете хороший метод инициализации NSManaged объекта в вашем пользовательском методе инициализации. Вы также можете очистить его до этого, чтобы взять Context, а затем вызвать initWithEntity ... на super там.

...