使用核心数据的Mantle-NSSet和NSArray



我需要你的帮助,因为我无法理解这件事。我在iOS中使用Mantle和CoreData。

我定义了如下关系:

帖子1:N评论

当我从REST服务中提取数据时,我会创建一个Mantle Object Post,其中包含一个NSMutableArray of Comments。

然后我把它存储在核心数据中,在这里我不知道我做的事情是否正确。

[MTLManagedObjectAdapter managedObjectFromModel:post insertingIntoContext:[self getManagedObjectContext] error:&error];

所以我这样做是为了将我的post对象存储到核心数据中。核心数据模型有一个名为"post_has_comments"的关系,它是一个级联的一对多关系。因此,在对象Post上,我有"posts_has_comments"->级联,在对象"Comment"上,我与"Nullify"有一对一的关系。

Afaik,Core Data将其视为NSSet。不过,我想加入的是一个NSMutableArray,因为Mantle会处理这个问题(至少快速查看它的来源告诉我)。

不幸的是,当我用从核心数据中取回对象时

Post* post = [MTLManagedObjectAdapter modelOfClass:Post.class fromManagedObject:[[self fetchedResultsController] objectAtIndexPath:indexPath] error:nil];

post对象上的属性注释是一个空的NSSet,我在事先插入它时会遇到一些错误。我得到的错误:

Core Data: annotation: repairing missing delete propagation for to-many relationship post_has_comments on object [...]

我被卡住了——也许我错过了什么大东西?

My Post Class实现了以下静态方法:

+ (NSDictionary *)managedObjectKeysByPropertyKey {
return @{
@"post_id" : @"id",
@"comments" : @"post_has_comments"
};
}
+ (NSDictionary *)JSONKeyPathsByPropertyKey {
return @{
@"post_id" : @"id",
};
}
+ (NSDictionary *)relationshipModelClassesByPropertyKey {
return @{
@"comments" : IHComment.class
};
}

一个简单的解决方法是编写自己的属性setter方法,如果设置的值是NSSet,则在将其设置回属性ivar之前将其转换为NSMutableArray

例如:

- (void)setComments:(NSMutableArray *)comments {
if ([comments isKindOfClass:NSSet.class]) {
_comments = [NSMutableArray arrayWithArray:[((NSSet *)comments) allObjects]];
} else {
_comments = comments;
}
}

我自己已经做了好几次了,效果很好!

来自Mantle文档:

Mantle可以轻松地为您的Cocoa或Cocoa Touch应用程序编写一个简单的模型层。

这只是一个未经证实的语句。看看这个框架,我看不出证据在哪里。你应该得到你的对象,并使用苹果的API将它们插入到核心数据中。

Post *cdPost = [NSEntityDescription insertNewObjectForEntityForName:@"Post"
inManagedObjectContext:self.managedObjectContext];
// configure the cdPost object with the data from the web service
for (id commentObject in commentArrayFromPostObject) {
Comment *cdComment = 
[NSEntityDescription insertNewObjectForEntityForName:@"Comment"
inManagedObjectContext:self.managedObjectContext];
// configure the cdComment object with the data from the web service
cdComment.post = cdPost;
}

这就是它的全部。

最新更新