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

Posted

技术标签:

【中文标题】如何将 NSObject 模型类转换为 NSManagedObject 的子类?【英文标题】:How to convert NSObject model class to a sub-class of NSManagedObject? 【发布时间】:2014-12-26 07:40:00 【问题描述】:

我有一个简单的模型类,它代表 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】:

因此,要将模型类转换为 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

【讨论】:

以上是关于如何将 NSObject 模型类转换为 NSManagedObject 的子类?的主要内容,如果未能解决你的问题,请参考以下文章

如果将一个NSObject从NSDictionary转换为NSString?

使用 Monotouch 时如何将 CGColor 转换为 NSObject?

如何从 json 字典自动创建模型类(NSObject)?

如何将带有类名的字符串转换为类类型本身?

将视图推出 NSObject 类

如何将此 JSON 格式转换为模型类并使用改造将响应转换为列表