如何在核心数据中保存实体并应用关系?

tar*_*eel 1 iphone core-data objective-c ios

我试图找到有关如何让用户动态添加对象并应用必要关系的苹果文档/教程,但需要一些帮助来了解哪些教程是好的或者哪些苹果文档会有所帮助。

我的核心数据问题的一个示例:Photographer和的 2 个实体,其中 a和Photo之间存在一对多关系。当用户添加 a 时,我需要能够指定是哪一个使用了该。PhotographerPhotoPhotoPhotographerPhoto

MGA*_*MGA 5

首先,您将为照片创建一个新实体:

    NSManagedObject *photoObject = [NSEntityDescription 
           insertNewObjectForEntityForName:[entity name]
                    inManagedObjectContext:context];    
Run Code Online (Sandbox Code Playgroud)

NSManagedObject 可以替换为您的 Photo 对象,或者如果您创建了子类,则可以使用 w/e 替换。您将为它设置所有属性。要设置摄影师,您将像设置任何其他属性一样设置它。如果您没有摄影师的参考资料,您可以这样查询:

    NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Photographer"];
    [query setPredicate:[NSPredicate predicateWithFormat:@"id == %@", photographerId]];
    NSArray *queryResults = [context executeFetchRequest:bcQuery error:&error];
Run Code Online (Sandbox Code Playgroud)

您的查询结果将包含摄影师对象。然后,您可以将其设置为您的 photoObject 上的任何其他属性,并且将自动创建链接。

     [photoObject setPhotographer:[queryResults objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

或者如果您使用的是 NSManagedObject:

    [photoObject setValue:[queryResults objectAtIndex:0] forKey:@"photographer"];
Run Code Online (Sandbox Code Playgroud)

CoreData 的酷之处在于它是关系型的。您不能真正将其视为典型的 DBMS。您以非常面向对象的方式创建对象并设置它们之间的关系。没有主键/外键需要处理,这一切都是由 CoreData 在后台完成的。

编辑:

您可以选择创建 NSManagedObject 的子类,以更轻松地访问实体的属性和关系。确保在 CoreData 模型资源管理器中指定此子类;在侧边栏中,您将“类”字段更改为新的子类。

以下是 NSManagedObject 子类的示例:

//Interface
@interface Photo : NSManagedObject

#pragma mark - Attributes

@property (nonatomic, strong) NSNumber *id;
@property (nonatomic, strong) NSString *name;

#pragma mark - Relationships

@property (nonatomic, strong) NSSet     *someToManyRelationship;
@property (nonatomic, strong) Photographer *photographer;

@end

//Implementation
@implementation Photo

@dynamic id, name;
@dynamic someToManyRelationship, photographer;

@end
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!