NSManagedObjects问题

时间:2016-05-20 12:06:34

标签: ios exception core-data relationship nsmanagedobject

我遇到了与一对多关系相关的CoreData问题。

实体1 - Authors与实体2具有一对多的关系 - Books。我认为BooksAuthors有一对一的关系。

由于作者对象中每位作者有多本书,我有

@property (nonatomic, retain) NSSet *book;

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;

有人可以建议如何解决这个问题吗?

更新

我也尝试将其切换为:

record.author = newAuthor;

但是这会给出错误

  

“属性'作者'在NSManagedObject类型的对象上找不到”

虽然在Books对象中定义了这样的属性(如上所示)。

2 个答案:

答案 0 :(得分:0)

由于book属性是一个集合,因此CoreData应该创建Authors方法,例如addBookObject:。创建自定义实体类时,应该有一个名称类似于“Authors + CoreDataProperties.h”的文件。在那里查找已定义的方法。

如果您使用Books而不是NSManagedObject,那么您的第二个选项也会有效。 即:

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

答案 1 :(得分: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];

这是db的示例,如下所示:

enter image description here

要自动生成类 - 在* .xcdatamodel文件中选择实体,然后按File-> New->文件选择CoreData部分和NSManaged Object子类,按向导步骤操作。

你会得到像

这样的东西

enter image description here

甚至更多:

enter image description here

好的教程你也可以找到here