如何将NSObject模型类转换为NSManagedObject的子类?

时间:2014-12-26 07:40:01

标签: ios objective-c iphone core-data core-data-migration

我有这个简单的模型类,代表RSS文章RSSEntry。

现在我想开始使用这个模型类来运行核心数据,但我没有选中“使用核心数据”复选框来创建项目。

这是班级:

#import <Foundation/Foundation.h>

@interface FRSSEntry : NSObject{
    NSString *_blogTitle;
    NSString *_articleTitle;
    NSString *_articleUrl;
    NSDate *_articleDate;
    NSString *_articleImageUrl;
    NSString *_content;
}

@property (copy) NSString *blogTitle;
@property (copy) NSString *articleTitle;
@property (copy) NSString *articleUrl;
@property (copy) NSDate *articleDate;
@property (copy) NSString *articleImageUrl;
@property (copy) NSString *content;

- (id)initWithBlogTitle:(NSString*)blogTitle articleTitle:(NSString*)articleTitle articleUrl:(NSString*)articleUrl articleDate:(NSDate*)articleDate articleImageUrl:(NSString *)imageUrl andContent:(NSString *)content;


@end

实施是:

#import "FRSSEntry.h"

@implementation FRSSEntry
@synthesize blogTitle = _blogTitle;
@synthesize articleTitle = _articleTitle;
@synthesize articleUrl = _articleUrl;
@synthesize articleDate = _articleDate;
@synthesize articleImageUrl = _articleImageUrl;
@synthesize content = _content;

- (id)initWithBlogTitle:(NSString*)blogTitle articleTitle:(NSString*)articleTitle articleUrl:(NSString*)articleUrl articleDate:(NSDate*)articleDate articleImageUrl:(NSString *)imageUrl andContent:(NSString *)content
{
    if ((self = [super init])) {
        _blogTitle = [blogTitle copy];
        _articleTitle = [articleTitle copy];
        _articleUrl = [articleUrl copy];
        _articleDate = [articleDate copy];
        _articleImageUrl = [imageUrl copy];
        _content = [content copy];
    }
    return self;
}
@end
很简单。现在我该如何转换它以便将其用作核心数据实体?

1 个答案:

答案 0 :(得分:1)

因此,要将模型类转换为NSManagedObject子类,必须删除实例变量声明。然后用@dynamic替换所有的@synthesize语句。这告诉编译器CoreData将为这些属性提供实现,因此它可以在那里发挥作用。然后还需要删除您拥有的自定义初始值设定项,因为NSManagedObject对象以不同的方式初始化。

代码看起来像

#import <Foundation/Foundation.h>

@interface FRSSEntry : NSManagedObject

@property (copy) NSString *blogTitle;
@property (copy) NSString *articleTitle;
@property (copy) NSString *articleUrl;
@property (copy) NSDate *articleDate;
@property (copy) NSString *articleImageUrl;
@property (copy) NSString *content;

@end

-

#import "FRSSEntry.h"

@implementation FRSSEntry

@dynamic blogTitle;
@dynamic articleTitle;
@dynamic articleUrl;
@dynamic articleDate;
@dynamic articleImageUrl;
@dynamic content;

@end

您通常会使用类似

的内容对其进行初始化
// Get the entity description
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"FRSSEntry" inManagedObjectContext:context];
// Insert a new YourModelObject into the context
ReceivedMessage *newMessage = [[FRSSEntry alloc] initWithEntity:entityDescription insertIntoManagedObjectContext:context];

您可以拥有自定义初始值设定项,但必须调用[super initWithEntity:entityDescription insertIntoManagedObjectContext:context]。所有这些参数的初始化程序都会很长,所以我建议你在初始化对象后设置每个属性。

从您的回复来看,您刚刚开始进行CoreData集成。在处理核心数据时,创建NSManagedObject子类只是冰山一角。 CoreData是一个复杂的大框架,因此我建议您先阅读https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html。 Stack Overflow也充满了关于这个主题的问题和很好的答案。 我建议你研究的另一件事是MagicalRecord。这是一个很棒的图书馆,它使一些繁琐的任务变得非常简单:https://github.com/magicalpanda/MagicalRecord