导入与 Core Data 和 Magical Record 的关系

Posted

技术标签:

【中文标题】导入与 Core Data 和 Magical Record 的关系【英文标题】:Importing relationships with Core Data and Magical Record 【发布时间】:2013-08-13 20:09:23 【问题描述】:

我正在从 Web 服务获取 JSON 数据,并尝试使用 Magical Record 将其存储在 Core Data 中。我阅读了 Saul Mora 的精彩帖子(而且只有文档?)“Importing data made easy”,但我仍然不明白我需要做什么才能获取实体中的所有数据。

这是 Web 服务返回的 JSON:


"ApiVersion": 4,
"AvailableFileSystemLibraries": [
    
        "Id": 10,
        "Name": "Movie Shares",
        "Version": "0.5.4.0"
    ,
    
        "Id": 11,
        "Name": "Picture Shares",
        "Version": "0.5.4.0"
    ,
    
        "Id": 5,
        "Name": "Shares",
        "Version": "0.5.4.0"
    ,
    
        "Id": 9,
        "Name": "Music Shares",
        "Version": "0.5.4.0"
    
],
"AvailableMovieLibraries": [
    
        "Id": 3,
        "Name": "Moving Pictures",
        "Version": "0.5.4.0"
    ,
    
        "Id": 7,
        "Name": "MyVideo",
        "Version": "0.5.4.0"
    
],
"AvailableMusicLibraries": [
    
        "Id": 4,
        "Name": "MyMusic",
        "Version": "0.5.4.0"
    
],
"AvailablePictureLibraries": [
    
        "Id": 8,
        "Name": "Picture Shares",
        "Version": "0.5.4.0"
    
],
"AvailableTvShowLibraries": [
    
        "Id": 6,
        "Name": "MP-TVSeries",
        "Version": "0.5.4.0"
    
],
"DefaultFileSystemLibrary": 5,
"DefaultMovieLibrary": 3,
"DefaultMusicLibrary": 4,
"DefaultPictureLibrary": 0,
"DefaultTvShowLibrary": 6,
"ServiceVersion": "0.5.4"

我想要存储该数据的实体如下所示:

还有一个 Server 实体与 ServerInfo 具有 1:1 的关系。

我想做什么:

在 ServerInfo 中存储基本数据(ApiVersion,...)。这个我已经开始工作了。 将每个对象存储在BackendLibrary 的AvailableXYLibraries 中(来自ServerInfo 的1:n 关系)。 根据 AvailableXYLibraries 的 XY 部分设置 type,例如 AvailableMovieLibraries 的“电影”。 如果 DefaultXYLibrary 引用了此库,则将 defaultLibrary 设置为 true。 将 providerId 设置为 servername + LibraryId,因为有多个服务器可以拥有具有相同数字 ID 的 BackendLibraries。

Magical Record 可以做到这一点吗?我想我需要实现一些导入钩子并设置一些用户信息键,但是我读到的所有内容并没有真正告诉我在哪里设置什么用户信息键或在哪里以及如何实现哪种方法。

我希望这是有道理的,并且您可以给我一些提示 :) 谢谢!

【问题讨论】:

【参考方案1】:

此数据的结构与您的核心数据模型有很大不同。您最有可能要做的是在字典上进行一些迭代。也就是说,有各种图书馆数据集合,例如。 FileSystemLibraries、AvailableMovieLibraries 等。您必须从这些键中取出数组,然后按照我在文章中的描述映射您的实体。为了启动该过程,您必须调用

[BackendLibrary importFromArray:arrayFromDownloadedDictionary];

arrayFromDownloadedDictionary 是您发布的示例字典中的每个数组。将数组提供给 MagicalRecord 并提供正确的字段映射后,MagicalRecord 将在此时导入并为您创建所有实体。

确保将“Id”映射到 BackendLibary.id,将“Name”映射到 BackendLibrary.name,将“Version”映射到 BackendLibrary.version

【讨论】:

谢谢,我想我明白了。你说没有办法自动使用relatedByKeyname 和故障转移来做到这一点,比如relatedByKeyname AvailableMovieLibraries、relatedByKeyname.1 AvailablePictureLibraries 等等,但我需要在 ServerInfo.importFromObject: 中循环响应并为我遇​​到的每个库数组调用 BackendLibrary.importFromArray .对?关系也会手动建立吗?喜欢 [info addLibrariesObject:...]?或者您认为以某种方式调整我的实体以更好地匹配数据会是一个很好的举措吗?非常感谢! 如果您可以将源数据更改为更接近您的核心数据模型,您将需要编写更少的代码,因为导入会为您遍历结构并更轻松地自动映射所有内容。 不,源数据不受我控制。我只能更改我的核心数据模型。所以我会尝试手动导入大部分内容。

以上是关于导入与 Core Data 和 Magical Record 的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Core Data 和 Magical Record 中存储一系列电子邮件

使用 Magical Record 将对象数组插入 Core Data

使用 Kiwi、Core Data 和 Magical Record 进行单元测试

Plain Core Data vs Core Data + Magical Record

尝试将服务器内容同步到 Core Data 时出现问题 - Magical Record 插入过程非常慢

带有 Magical Record 的导入记录不会立即显示在 tableView 中