从多对多关系中获取NSEntityDescription

时间:2014-07-05 07:18:33

标签: ios core-data

我有一个具有多对多关系的用户实体,称为“录音”。

生成的界面如下所示:

@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 *)newRecording
{
    Recording *recording = [NSEntityDescription 
        insertNewObjectForEntityForName:@"Recording" 
        inManagedObjectContext:self.managedObjectContext];

    return recording;
}

我将@"Recording"实体名称传递给insertNewObjectForEntityForName::,这样可以正常工作;但是,我不喜欢我的对象知道其.recordings关系属性的实际实体名称。

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

2 个答案:

答案 0 :(得分:1)

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

否则,您正在使用实体说明获取relationshipsByName,使用关联的关系说明获取destinationEntity,然后您拥有所需的name 。您可以将其添加为类别方法,以便轻松访问。

答案 1 :(得分:0)

如果您不想使用mogenerator,正如@Wain建议的那样,您可以反映其方法。在Recording上编写一个类方法,以创建与特定Recording相关的新User

Recording.h

+ (Recording *)insertInManagedObjectContext:(NSManagedObjectContext *)moc;
+ (Recording *)insertWithUser:(User *)user;

Recording.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;
}

您还需要编写一个方法来搜索现有的Recording对象,使用适当的任何唯一标准(“查找或创建”模式),并在{{1}中调用该方法而不是总是插入新的+insertWithUser: