核心数据中多对多关系的属性声明

hek*_*ran 9 macos cocoa core-data objective-c

我有一个使用Core Data编写的应用程序.我有2个具有一对多关系的实体.我为它们都分类了NSManagedObject.单侧的实体称为播放列表,另一侧称为Song.

播放列表的界面:

@interface VBPlaylist : NSManagedObject {
}

@property (readwrite, copy) NSString *name;

@end
Run Code Online (Sandbox Code Playgroud)

播放列表的实现:

@implementation VBPlaylist

@dynamic name;

@end
Run Code Online (Sandbox Code Playgroud)

我想我应该有另一个属性来指示播放列表类下的歌曲.我找不到任何示例代码来显示作为属性编写的多对多关系.你怎么做到这一点?

Bar*_*ark 18

一对一关系被Core Data建模为对象引用.因此,从实体Bar到实体的一对一关系Baz(假设Baz由类实现Baz)将是

@interface Bar : NSManagedObject {
}

@property (readwrite,nonatomic) Baz * toBaz;

@end
Run Code Online (Sandbox Code Playgroud)

多对多关系被建模为可变集属性(尽管不是一个NSMutableSet).假设从一对多的关系Bar,以Baz所谓的manyBazz:

@interface Bar : NSManagedObject {

}

@property (retain) NSSet* manyBazz;

@end

// coalesce these into one @interface AnalysisRecord (CoreDataGeneratedAccessors) section
@interface Bar (CoreDataGeneratedAccessors)
- (void)addManyBazzObject:(Baz *)value;
- (void)removeManyBazzObject:(Baz *)value;
- (void)addManyBazz:(NSSet *)value;
- (void)removeManyBazz:(NSSet *)value;

@end
Run Code Online (Sandbox Code Playgroud)

如果要使用NSMutableSet接口来操作manyBazz关系,则应调用-mutableSetValueForKey:@"manyBazz"以获取与该manyBazz关系的KVO兼容代理.

在Leopard(OS X 10.5)及更高版本中,所有适当的方法都是由Core Data框架在运行时自动生成的,即使您没有明确声明或实现它们(当然,如果您尝试,您将获得编译器警告使用它们而不在头文件中声明它们).因此,您不需要子类

获得声明和实现的最简单方法是在数据建模器中选择属性,然后从"设计 - >数据模型"菜单中选择"将Objective-C 2.0方法声明复制到剪贴板",粘贴到您的实现类中. h文件.当然,你必须让你的.h和模型保持同步...因此,对于rentzsch非常棒的MO生成器,这是一个从数据模型中自动生成(并重新生成)NSManagedObject子类的工具.


Jim*_*vey 16

为CoreData实体创建.h和.m文件的最简单方法是:

  1. 在数据建模器中选择一个实体.
  2. 按Command-N或选择文件 - >新文件...
  3. 从源列表中选择"Cocoa".
  4. 在模板选择器中,您现在应该看到一个名为"托管对象类"的项目.如果不存在,请单击"取消"并重复步骤1-2.
  5. 按Next,选择项目/目标,然后再次按Next.
  6. 现在您看到类似以下窗口的内容:New Managed Object Class窗口http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. 选择所需的选项,然后单击"完成".

这将生成以下标头和源文件:

Entity.h:

#import <CoreData/CoreData.h>


@interface Entity :  NSManagedObject  
{
}

@property (retain) NSNumber * uniqueID;
@property (retain) NSString * name;
@property (retain) Entity * parent;
@property (retain) NSSet* children;

@end

@interface Entity (CoreDataGeneratedAccessors)
- (void)addChildrenObject:(Entity *)value;
- (void)removeChildrenObject:(Entity *)value;
- (void)addChildren:(NSSet *)value;
- (void)removeChildren:(NSSet *)value;

@end
Run Code Online (Sandbox Code Playgroud)

Entity.m:

#import "Entity.h"


@implementation Entity 

@dynamic uniqueID;
@dynamic name;
@dynamic parent;
@dynamic children;

@end
Run Code Online (Sandbox Code Playgroud)

请注意,该实现不包含除@dynamic标记之外的任何内容,以告诉编译器不要担心缺少与属性匹配的方法/变量.