我遇到了与一对多关系相关的CoreData问题。
实体1 - Authors
与实体2具有一对多的关系 - Books
。我认为Books
与Authors
有一对一的关系。
由于作者对象中每位作者有多本书,我有
@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
对象中定义了这样的属性(如上所示)。
答案 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的示例,如下所示:
要自动生成类 - 在* .xcdatamodel文件中选择实体,然后按File-> New->文件选择CoreData
部分和NSManaged Object子类,按向导步骤操作。
你会得到像
这样的东西甚至更多:
好的教程你也可以找到here