【问题标题】:Entity relationship between NSManagedObjects issueNSManagedObjects 之间的实体关系问题
【发布时间】:2016-09-17 16:45:32
【问题描述】:

我遇到了与一对多关系相关的 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对象中定义了这样一个属性(如上图)。

【问题讨论】:

    标签: ios exception core-data relationship nsmanagedobject


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,我很抱歉,但我一直在努力解决这个问题......书籍 *record = ????
    • 另外,如果核心数据创建了该方法,这是在后台还是我应该做些什么?
    • 我试图修正答案。让我知道我们做得怎么样。 :)
    【解决方案2】:

    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 文件中的实体,然后按文件->新建->文件选择 CoreData 部分和 NSManaged Object 子类,按照向导步骤进行。

    你会得到类似的东西

    还有更多:

    很好的教程你也可以找到here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多