将 JSON 数据转换并存储为 iOS Core Data

Posted

技术标签:

【中文标题】将 JSON 数据转换并存储为 iOS Core Data【英文标题】:Converting and storing JSON data into iOS Core Data 【发布时间】:2013-10-16 17:07:10 【问题描述】:

基本上,我正在开发一个允许用户跟踪他们的电视节目的应用程序。用户可以点击他们的电视节目以获取季节和剧集细分。

为了实现这一点,我试图从这个 API 收集 JSON 数据,然后将数据存储到核心数据中。 API调用是这样的: http://api.trakt.tv/show/summary.json/36590b30dc7d0db9ebd3153b1a989e5d/arrow/1

我可以成功存储以下值:title、year、url、first_aired 等。但我不知道如何将季节和剧集信息存储到我的核心数据中(位于 JSON API 调用的一半左右)

我提供了一个链接,指向我如何设置核心数据模型的屏幕截图: !http://i546.photobucket.com/albums/hh427/camcham/ScreenShot2013-10-17at34449AM.png

下面的代码是我目前尝试将 JSON 数据存储到我的核心数据中的方式(使用 MagicalRecords

NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];


        Show *showp = [Show MR_findFirstByAttribute:@"sID" withValue:showID inContext:localContext];
        if (![showp.sID isEqualToString:showID])
        
            //Create New Show in current thread
            Show *showContext = [Show MR_createInContext:localContext];
            showContext.title = showTitle;
            showContext.poster = showPoster;
            showContext.year = showYear;
            showContext.sID = showID;
            //code above this comment correctly adds right JSON info to core data and i can access and display it properly

我的代码的下一部分我尝试将 NSArray 转换为 NSSet,因为我的“季节”关系是 NSSet 类型,但是我相信 JSON 数据是 NSArray。我收到以下错误:* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFNumber managedObjectContext]: unrecognized selector sent to instance 0xa22a680”

                NSArray *show = [(NSSet *)[JSONEvents objectForKey:@"seasons"] valueForKey:@"season"];
            showContext.seasons = [NSSet setWithArray:show];

下面的代码不能按预期工作。例如 episode.title 存储每一集的标题,而不仅仅是特定集的单个标题。

            Season *season = [Season MR_createInContext:localContext];
            season.seasonNumber = [(NSDictionary *)[JSONEvents objectForKey:@"seasons"] valueForKey:@"season"];
            season.episodes = [(NSDictionary *)[JSONEvents objectForKey:@"seasons"] valueForKey:@"episodes"];


            Episode *episode = [Episode MR_createInContext:localContext];
            episode.title = [[(NSDictionary *)[season.episodes objectForKey:@"seasons"] valueForKey:@"episodes"] valueForKey:@"title"];
            episode.overview = [[(NSDictionary *)[JSONEvents objectForKey:@"seasons"] valueForKey:@"episodes"] valueForKey:@"overview"];

总而言之,我希望有人能够演示从我的 JSON API 存储电视季节和剧集的正确方法,这样我就可以在我的应用程序中使用这些数据!

【问题讨论】:

您是否收到多集和多季,因为看起来您只创建了 1 季和 1 集。 我正在尝试存储多个季节和剧集,但上面的代码将所有剧集存储在一起,而不是新剧集的单独对象。如何更改我的代码以正确存储季节和剧集数据? 【参考方案1】:

删除转换为 (NSSet *) 应该可以修复错误。

NSArray *show = [[JSONEvents objectForKey:@"seasons"] valueForKey:@"season"];
showContext.seasons = [NSSet setWithArray:show];

而不是

NSArray *show = [(NSSet *)[JSONEvents objectForKey:@"seasons"] valueForKey:@"season"];
showContext.seasons = [NSSet setWithArray:show];

【讨论】:

以上是关于将 JSON 数据转换并存储为 iOS Core Data的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 将 JSON 对象转换为有序数组

将 iOS 应用从 NSCoding 转换为 Core Data

ASP.NET Core MVC - 将 HTML 表转换为 json 并使用 ajax 发送到控制器

ASP.NET Core —上传.json文件并转换为List

如何将 JSON 转换为 CSV 格式并存储在变量中

如何将 MKMapItem 转换为二进制数据以存储在 Core Data 中?