我对CoreData和NSManagedObject有疑问。
在我的应用程序的体系结构中,我有一个REST客户端,用于构建从服务器收到的对象实例。
例如我有这个方法:
- (NSArray*) getAllCards:(NSDictionary*) jsonResponse;
接受JSON响应并返回一组Cards。
没关系......
现在我需要将我的卡保存在CoreData中。
我定义了我的模型,所以我有一些NSManagedObject的子类。
例如:Card: NSManagedObject
但我希望有一个简单的构造函数来从JSON构造对象,然后将其传递给我的经理,他将把它添加到CoreData中。
我不会将与CoreData相关的一些信息(例如Context ..)传递给我的客户端REST ...我想在我的CoreData CoreData Manager中使用逻辑。
如何定义卡片的有效构造函数?
我可以用这种方式定义构造函数吗?
- (id) initWithName:(NSString*) name
cardId:(NSString*) cardId
type:(NSString*) type
{
self = [super initWithEntity:nil insertIntoManagedObjectContext:nil]; //This is wrong..
if (self) {
self.name = name;
self.cardId = cardId;
self.type = type;
}
}
答案 0 :(得分:0)
我认为没有必要覆盖init方法。只需为您的CoreDataManager
类提供一个获取字典并生成核心数据实体的方法。
-(void)storeCardsFromJSON:(NSDictionary*)dictionary {
for (NSDictionary *cardInfo in dictionary[@"cardArray"]) {
Card *newCard = [NSEntityDescription insert...];
newCard.cardID = cardInfo[@"cardID"];
// etc.
}
// save
}
或者,返回一组新创建的卡片。在此方法中,您还可以过滤掉已存在的卡片(例如,基于cardID
属性)并修改这些卡片,而不是再次插入它们。
在您的应用中,您应该只使用Core Data中的Card
个对象。不需要使用不同类别的对象,也不需要使用NSDictionary
个对象。
答案 1 :(得分:0)
也许它会有所帮助:对于我可以从JSON创建的所有NSManagedObject子类,我添加了一个名为MyObject + JSON的类别,我有两种方法:
+ (instancetype)deserializeFromDictionary:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context;
- (void)updateFromDictionary:(NSDictionary *)dictionary;
我使用inContext:part因为我通常使用私有上下文为整个事务批量插入对象。
方法如下:
+ (instancetype)deserializeFromDictionary:(NSDictionary *)dictionary inContext:(NSManagedObjectContext *)context;
{
if (!dictionary || ![dictionary isKindOfClass:[NSDictionary class]] || !context) {
return nil;
}
MyObject *anObject = (MyObject *)[NSEntityDescription insertNewObjectForEntityForName:@"MyObject" inManagedObjectContext:context];
[anObject updateFromDictionary:dictionary];
return anObject;
}
和
- (void)updateFromDictionary:(NSDictionary *)dictionary
{
NSParameterAssert(dictionary);
if (!dictionary || ![dictionary isKindOfClass:[NSDictionary class]]) {
return;
}
self.identifier = dictionary[@"id"];
self.title = dictionary[@"title"]; //and so on
}