2014-01-10 31 views
7

我需要你的帮助,因为我无法理解这一点。我在iOS中使用Mantle和CoreData。在核心数据中使用地幔 - NSSet和NSArray

我有看定义的关系如下:

后1:N评论

当我拉离我的REST服务的数据,我创建了在它有评论的NSMutableArray的地幔对象帖子。这工作完美无瑕。

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

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

所以我这样做来存储我的帖子对象到核心数据。核心数据模型有一个叫做“post_has_comments”的关系,这是一个级联的一对多关系。因此,在对象Post上我有“posts_has_comments” - >级联,在我的对象上“评论”我与“Nullify”有一对一的关系。

Afaik,Core Data将此视为NSSet。但是我试图放入的是一个NSMutableArray,因为Mantle会处理这个问题(至少这是在源代码中快速查看的内容)。

不幸的是,当我得到的对象从核心数据回来

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

后对象的属性评论是空的NSSet,和我在事先插入的东西得到相当一些错误。我得到的错误:

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

我被卡住了 - 也许我错过了一些巨大的东西吗?

我的职务类实现下列静态方法:

+ (NSDictionary *)managedObjectKeysByPropertyKey { 
return @{ 
     @"post_id" : @"id", 
     @"comments" : @"post_has_comments" 
     }; 
} 

+ (NSDictionary *)JSONKeyPathsByPropertyKey { 
    return @{ 
      @"post_id" : @"id", 
      }; 
} 

+ (NSDictionary *)relationshipModelClassesByPropertyKey { 
    return @{ 
      @"comments" : IHComment.class 
      }; 
} 
+0

你解决了这个问题吗? – onmyway133

+0

对此有何更新? –

+0

您可以查看我对答案的回复 - 但是,我不知道这是如何适用今天,因为这是两年前现在。 – Elysium

回答

-5

来自地幔文档:

Mantle makes it easy to write a simple model layer for your Cocoa or Cocoa Touch application.

这简直是一个未经证实的说法。看看这个框架,我看不出证据在哪里。你应该得到你的对象,并使用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; 
} 

就是这样。

+0

那么,答案并不完全正确,但指出我在正确的方向。 我发现尽管Mantle确实支持CoreData,但它在CoreData中有逆向关系的问题和注意事项。一个解决方案就是自己简单地管理它,或者在进一步改进之前避免使用Mantle。 此外,我有一个非常讨厌的错误serverside和地幔结合CoreData绊倒它真的很糟糕,没有任何例外。 :( – Elysium

+0

我通过我的代码再次读 - 只是出于兴趣:什么是不完全正确的? – Mundi

+0

代码是非常好的 “你应该得到你的对象,并使用Apple的API插入到核心数据。” Mantle提供了自己的界面来做到这一点: '[MTLManagedObjectAdapter managedObjectFromModel:car insertingIntoContext:self.masterManagedObjectContext error:NULL];'这使得也可以从核心数据中获取Mantle对象,这对于这些对象来说很有用然后通过Mantle轻松地序列化为JSON – Elysium

0

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

例如:

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

我已经做到了我好几次,它就像一个魅力!