2016-05-20 3 views
0

Я столкнулся с проблемой CoreData, связанной с отношениями «один ко многим».Связь между объектами NSManagedObjects

Предприятие 1 - Authors имеет отношения «один ко многим» с субъектом 2 - Books. Я думаю, что Books имеет отношения «один к одному» с Authors.

Поскольку существует несколько книг одного автора в объекте автора У меня есть

@property (nonatomic, retain) NSSet *book; 

Соответствующее свойство в книге объекта:

@property (nonatomic, retain) Authors *author; 

Когда загружает приложение книги с сервера через API, после сохранения книги, я также пытаюсь сохранить автора и связать книгу с автором следующего кода:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Books" inManagedObjectContext:self.managedObjectContext]; 

NSManagedObject *record = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 
record setValue:bookname forKey:@"bookname"]; 

if ([self.managedObjectContext save:&error]) { 
    Authors *newAuthor = [NSEntityDescription insertNewObjectForEntityForName:@"Authors" inManagedObjectContext:self.managedObjectContext]; 
         newAuthor.aid = authorid;      
         newAuthor.book = record; 
} 

Этот код работает для меня один на один отношений, но и в этом случае, бросает следующее сообщение об ошибке исключения:

'NSInvalidArgumentException', reason: 'Unacceptable type of value for 
to-many relationship: property = "book"; desired type = NSSet; given 
type = Books; 

Может кто-нибудь подскажет, как это исправить?

Update:

Я также попытался переключая его вокруг, чтобы читать:

record.author = newAuthor; 

Но это дает ошибку

"property 'author' not found on object of type NSManagedObject"

хотя есть такое свойство, определенное в Books объекта (как показано выше).

ответ

0

Поскольку свойство book представляет собой набор, CoreData должен был создать метод Authors, такой как addBookObject:. Когда вы создаете свои пользовательские классы сущностей, должен быть файл с именем, похожим на «Authors + CoreDataProperties.h». Посмотрите там для определенных методов.

Ваш второй вариант также должен работать, если вы используете Books вместо NSManagedObject. т.е.

Books *record = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:self.managedObjectContext]; 
+0

Жаль быть плотным, но я был удар моя голова об этом какое-то время ... Книги * запись = ???? – zztop

+0

также, если основные данные создают метод, это под капотом или я должен что-то делать? – zztop

+0

Я попытался исправить ответ. Дайте мне знать, как мы это делаем. :) –

0

U может генерировать NSManagedObject подкласс, после того, как просто создать несколько объектов, устанавливать отношения и сохранить контекст однажды коснуться как:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:self.context]; 
Book *newBook = [[Book alloc] initWithEntity:entity insertIntoManagedObjectContext:self.context]; 
newBook.bookName = @"My new book"; 

NSEntityDescription *entity2 = [NSEntityDescription entityForName:@"Record" inManagedObjectContext:self.context]; 
Record *newRecord = [[Record alloc] initWithEntity:entity2 insertIntoManagedObjectContext:self.context]; 
newRecord.name = @"New record"; 

newBook.record = newRecord; 
[newRecord addBook:[NSSet setWithObject:newBook]]; 

[self.context save:nil]; 

Это пример для дб, как показано ниже:

Для создания классов автогенерации - выберите Объекты в файле * .xcdatamodel и нажмите Файл-> Создать -> Выбор файла CoreData и подкласс NSManaged Object, шаг за шагом мастера.

вы получите что-то вроде

enter image description here

И еще:

enter image description here

Хороший учебник U может также найден here

Смежные вопросы