Ios 从多个关系中获取N实体描述

Ios 从多个关系中获取N实体描述,ios,core-data,Ios,Core Data,我有一个名为“recordings”的用户实体,它有一个对多关系 生成的界面如下所示: @interface User : NSManagedObject @property (nonatomic, retain) NSString * display_name; // ... @property (nonatomic, retain) NSSet *recordings; // <-- this one @end @interface User (CoreDataGeneratedAc

我有一个名为“recordings”的用户实体,它有一个对多关系

生成的界面如下所示:

@interface User : NSManagedObject
@property (nonatomic, retain) NSString * display_name;
// ...
@property (nonatomic, retain) NSSet *recordings; // <-- this one
@end

@interface User (CoreDataGeneratedAccessors)
- (void)addRecordingsObject:(Recording *)value;
- (void)removeRecordingsObject:(Recording *)value;
- (void)addRecordings:(NSSet *)values;
- (void)removeRecordings:(NSSet *)values;
@end
我将
@“Recording”
实体名称传递给
insertNewObjectForEntityForName::
,这样就可以了;但是,我不喜欢我的对象知道其
.recordings
关系属性的实际实体名称

有没有一种简单的方法可以说“为此关系创建一个新对象”

您可以查看它添加的方便方法,这些方法允许您向NSManagedObject子类询问其实体名称。这将是对当前代码的最小更改


否则,您将使用实体描述来获取
关系语法名称
,使用关联关系描述来获取
目的属性
,然后获得所需的
名称
。您可以将其添加为一个category方法,以便轻松访问。

如果您不想像@Wain建议的那样使用mogenerator,您可以镜像它的方法。在
录制
上编写一个类方法,以创建与特定
用户
相关的新
录制

录制.h
中:

+ (Recording *)insertInManagedObjectContext:(NSManagedObjectContext *)moc;
+ (Recording *)insertWithUser:(User *)user;
录制.m中

+ (Recording *)insertInManagedObjectContext:(NSManagedObjectContext *)moc
{
    Recording *recording = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Recording" 
        inManagedObjectContext:moc];

    return recording;
}

+ (Recording *)insertWithUser:(User *)user
{
    // an NSManagedObject subclass knows its MOC
    Recording *recording = [self insertInManagedObjectContext:user.managedObjectContext];
    [recording.users addRecordingsObject:recording];

    return recording;
}
您还需要编写一个方法,使用任何合适的uniquing条件(“查找或创建”模式)搜索现有的
录制
对象,并在
+insertWithUser:
中调用该方法,而不是总是插入新的
录制

+ (Recording *)insertInManagedObjectContext:(NSManagedObjectContext *)moc
{
    Recording *recording = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Recording" 
        inManagedObjectContext:moc];

    return recording;
}

+ (Recording *)insertWithUser:(User *)user
{
    // an NSManagedObject subclass knows its MOC
    Recording *recording = [self insertInManagedObjectContext:user.managedObjectContext];
    [recording.users addRecordingsObject:recording];

    return recording;
}