使用 MagicalRecord 从 JSON 中保存父子关系

Posted

技术标签:

【中文标题】使用 MagicalRecord 从 JSON 中保存父子关系【英文标题】:Save parent child relationship from JSON using MagicalRecord 【发布时间】:2013-09-04 16:10:06 【问题描述】:

我正在读取具有以下关系的本地 JSON 文件

Country -< Venues

JSON 文件包含所有国家作为父项,然后将场所作为子项,如下例所示:

// Sample JSON (Countries have many venues)
    [
        "id": 1,
        "name": "USA",
        "venues": [
            
                "venue": "Von Braun Center",
                "city" : "Huntsville",
                "state": "Alabama",
                "capacity": 13760
            
        ]
    ];

我遇到的问题是我想使用 MagicalRecord 保存实体和关系,但它一直抱怨上下文无效。

// Read through a JSON file then save to Core Data
        [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *c) 
            Country *country = [Country createInContext:c];
            [country setName:name];
         completion:^

            for (NSDictionary *venueData in venues) 

                NSString *venue = (NSString *) [venueData objectForKey:@"venue"];
                NSString *city = (NSString *) [venueData objectForKey:@"city"];
                NSString *state = (NSString *) [venueData objectForKey:@"state"];

                Venue *v = [Venue createEntity];
                v.name = venue;
                v.city = city;
                v.state = state;
                v.country = country;

             // next

            [[NSManagedObjectContext defaultContext] saveNestedContexts];
        ];

我需要先保存country,但我无法在第二部分中使用它,我将地点设置为一个国家/地区。

我的问题是:

    如何保存国家并使用 MagicalRecord 在国家和场地对象之间创建/保存关系

    如何使我的国家对象在完成块中工作。

非常感谢


根据 SO 成员的建议,我已经能够将问题归为一个块来解决;

for (NSDictionary *dict in json) 
                NSString *name = (NSString *) [dict objectForKey:@"name"];
                NSArray *venueList = (NSArray *) [dict valueForKey:@"venues"];

                [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *c) 
                    Country *country = [Country createInContext:c];
                    [country setName:name];

                    for (NSDictionary *venueData in venueList) 

                        NSString *name = (NSString *) [venueData objectForKey:@"venue"];
                        NSString *city = (NSString *) [venueData objectForKey:@"city"];
                        NSString *state = (NSString *) [venueData objectForKey:@"state"];
                        //NSNumber *capacity = (NSNumber *) [NSNumber numberWithInt:[[venueData valueForKey:@"capacity"] intValue]];

                        Venue *v = [Venue createInContext:c];
                        [v setName:name];
                        [v setCity:city];
                        [v setState:state];
                        [v setCountry:country];
                     // next

                 completion:^
                ];
             // next

非常感谢所有帮助过的人

【问题讨论】:

为什么要先救国? 因为一个国家有很多场馆。在创建任何场所之前,我需要定义并存在国家/地区。 为什么。您只需迭代场地并将它们全部添加。如果您正在批处理,那么也许但是您已经可以使用您的国家/地区了。 我认为我必须先让一个对象存在才能使用它,但我会尝试按照@casademora 将它们添加到同一个块中 【参考方案1】:

只需在第一个保存块中完成所有操作,忘记完成块。在这种情况下只保存一次是可以的,这样您就不必担心在错误的上下文中创建对象。

【讨论】:

好的,我会试试这个。我以前没有这样做过,我认为我必须一次做一点 请注意,在您的原始文件中,您并没有一次只做一个场地。唯一的要求是您保存的内容是有效且一致的。

以上是关于使用 MagicalRecord 从 JSON 中保存父子关系的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord:修改相关对象的属性

使用 MagicalRecord 导入数据

设备上的 WebRequest (AFNetworking) 时 TableView 无响应,但在模拟器中正常 + MagicalRecord 问题

带有 MagicalRecord 的 JSONModel

MagicalRecord:后台保存

MagicalRecord 密钥路径