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

时间:2014-01-10 10:41:05

标签: ios objective-c core-data github-mantle

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

我定义的关系如下:

发布1:N评论

当我从我的REST服务中提取数据时,我创建了一个Mantle对象帖子,其中包含一个NSMutableArray of Comments。这完美无缺。

然后我将其存储在Core Data中,这是我不知道我是否做得对的地方。

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

所以我这样做是为了将我的帖子对象存储到Core Data中。核心数据模型具有称为“post_has_comments”的关系,这是一种级联的一对多关系。所以在对象Post上我有“posts_has_comments” - >级联,在我的对象“评论”我与“Nullify”有一对一的关系。

Afaik,Core Data将此视为NSSet。我试图放入的是一个NSMutableArray,因为Mantle会处理这个问题(至少那是它源代码中的简要说明)。

不幸的是,当我使用

从Core Data获取对象时
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
             };
}

2 个答案:

答案 0 :(得分:0)

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

例如:

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

我已经完成了很多次,它就像一个魅力!

答案 1 :(得分:-5)

来自Mantle文档:

  

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

这只是一个未经证实的陈述。看看这个框架,我看不出证据在哪里。您应该获取对象,并使用Apple的API将它们插入Core Data。

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;
}

这就是它的全部。