NSJSON序列化到核心数据

Posted

技术标签:

【中文标题】NSJSON序列化到核心数据【英文标题】:NSJSONSerialization to Core Data 【发布时间】:2014-02-23 19:47:44 【问题描述】:

我正在编写一个将一些 json 数据转换为核心数据的程序。我可以填充实体,当我尝试填充关系的实体时出现问题。

我尝试了很多不同的东西,但这是我现在所拥有的:

NSArray *jsonArray = [NSJSONSerialization
                      JSONObjectWithData:responseData
                      options:NSJSONReadingMutableContainers
                      error:&error];

Group *groupModel = [NSEntityDescription
                     insertNewObjectForEntityForName:@"Group"
                     inManagedObjectContext:context];

//NSLog(@"%@", jsonArray);

for (NSDictionary *array in jsonArray)

    groupModel.name = [array valueForKey:@"name"];

    NSSet *itemSet = [array valueForKey:@"items"];
    NSLog(@"%@", itemSet);
    groupModel.deck = itemSet;

    for (NSDictionary *item in [array valueForKey:@"items"])
    
        //groupModel.deck = telephoneSet;
    

    //NSLog(@"%@", [array valueForKey:@"name"]);

    //NSLog(@"%@", [array valueForKey:@"items"]);

我已经尝试了各种方法来插入这些数据,但我无法弄清楚。我知道我的班级 Group 与 Deck 有关系:

@property (nonatomic, retain) NSSet *deck;

所以我试图传递从 json 转换的 NSSet,但我无法完全弄清楚。我尝试过以各种不同的方式循环它并将其转换为不同的类型。

[
    
        "name": "Default",
        "items": [
            
                "name": "Name 1",
                "weapon": "Weapon 1",
                "type": "Type 1"
            ,
            
                "name": "Name 2",
                "weapon": "Weapon 2",
                "type": "Type 2"
            
        ]
    
]

需要将数组中的项目转换为集合并传递给组属性。这是我想不通的部分。

甲板.h:

@interface Deck : NSManagedObject

@property (nonatomic, retain) NSString * info;
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSString * type;
@property (nonatomic, retain) NSString * weapon;
@property (nonatomic, retain) Group *group;

组.h

@interface Group : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *deck;
@end

@interface Group (CoreDataGeneratedAccessors)

- (void)addDeckObject:(Deck *)value;
- (void)removeDeckObject:(Deck *)value;
- (void)addDeck:(NSSet *)values;
- (void)removeDeck:(NSSet *)values;

【问题讨论】:

显示模型/实体类标题。考虑看看 RestKit。 另外,你为什么要命名一个字典变量array,而itemSet 将是一个NSArray,即使你希望它可能是一个NSSet... 我添加了类头 Wain,就像我说的那样,我已经为此工作了很长时间。我已经更改了很多代码并尝试了很多不同的东西。每次尝试不同的东西时,我都没有更改变量数组。 【参考方案1】:

我鼓励你使用 RestKit 来帮助解决这个问题。

你有一个主要的基本问题:

    您永远不会创建Deck 的任何实例。你需要。您正在尝试将一组字典设置为 deck,它需要一组 Deck 对象。

基本上,在您的for (NSDictionary *item ... 循环中,您应该做的第一件事是创建一个Deck 实例。然后使用item 字典内容对其进行配置。然后调用:

[groupModel addDeckObject:deck];

(不要费心尝试使用所有Deck 对象设置NSSet,无论如何您都需要迭代)。

【讨论】:

我发誓我尝试过这样做,但它一直在说我的一对多关系和崩溃。这次它确实奏效了,所以谢谢。我看了一点 RestKit,但我会再检查一遍。

以上是关于NSJSON序列化到核心数据的主要内容,如果未能解决你的问题,请参考以下文章

NSJSON序列化问题。发送到 api 的 JSON 对象不正确

NSJSON序列化和表情符号

在swift ios中解析NSJSON序列化中的json时出错

如何在 swift 2.0 中使用 catch 概念

Swift 2:将 JSON 原生序列化为核心数据模型对象

jstorm 核心