如何将 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?