Почему CoreData падает с «нераспознанным селектором», когда я пытаюсь установить связь? - PullRequest
0 голосов
/ 05 июля 2010

У меня есть простая древовидная структура в одной сущности CoreData под названием «Элемент».

Любой элемент может быть родительским для другого элемента и может иметь несколько дочерних элементов.

В сущности есть следующие отношения:

childItems: To-Many, Пункт назначения: Элемент, обратный: parentItem. необязательный parentItem: назначение: элемент, обратное: childItems. опционально

Я использую сгенерированный Xcode следующий Item.h:

@interface Item :  NSManagedObject  
{
}

@property (nonatomic, retain) NSString * title;

@property (nonatomic, retain) Item * parentItem;
@property (nonatomic, retain) NSSet* childItems;


@end


@interface Item (CoreDataGeneratedAccessors)
- (void)addChildItemsObject:(Item *)value;
- (void)removeChildItemsObject:(Item *)value;
- (void)addChildItems:(NSSet *)value;
- (void)removeChildItems:(NSSet *)value;

@end

Запрос на выборку очень прост:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
    entityForName:@"Item" inManagedObjectContext:[self managedObjectContext]];
[fetchRequest setEntity:entity];    
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO];

[fetchRequest setSortDescriptors:[NSArray arrayWithObjects: sort, nil]];
[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
        managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil 
        cacheName:@"AllItemsCache"];

Когда я пытаюсь установить отношения, они просто терпят крах. Почему?

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0];
[item addChildItemsObject:childItem];

вывод отладки:

*** -[Item addChildItemsObject:]: unrecognized selector sent to instance 0x5494140

(gdb) po 0x5494140
<Item: 0x5494140> (entity: Item; id: 0x54921d0 <x-coredata://AB862620-04BE-4E42-84A6-8723455F5957/Item/p1> ; data: {
    title = Test123;
})

Я могу установить или получить другие свойства просто отлично. но когда я пытаюсь изменить отношения, это терпит крах. Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 09 июля 2010

Найдена причина проблемы.

Модель CoreData и классы данных работают, только если они находятся внутри вашего проекта.Если вы поместите их в зависимый проект, у него будут странные ошибки, как указано выше.

Мои классы .xcdatamodel и entity были в другом проекте, а другой проект добавлен в основной проект.переместил все в основной проект и удалил зависимости, все работает нормально.

1 голос
/ 06 июля 2010

Я бы предположил, что это конфликт имен, вызванный использованием в качестве имени класса общего слова, такого как «Элемент». Попробуйте изменить название на более уникальное.

В качестве альтернативы, вы можете попробовать проверить, отвечает ли класс методу:

Item *item = [itemFetchedResultsController.fetchedObjects objectAtIndex:0];
NSLog(@"responds=%@",[item respondsToSelector:@selector(addChildItemsObject:)] ?@"YES":@"NO");
[item addChildItemsObject:childItem];

или исследуйте класс возвращаемого объекта напрямую:

NSLog(@"class=%@",[[itemFetchedResultsController.fetchedObjects objectAtIndex:0] class]);

Возможно, что вы на самом деле возвращаете универсальный NSManagedObject, который молча приводится к его подклассу Item. Вряд ли, но вы могли бы также проверить.

...