魔法记录导入(下一步)

2023-12-05

我在标题中添加了下一步,因为这与我之前的问题不同,标题几乎完全相同。

我有一个Person entity.

Person
--------
name      - mappedKeyName: FullName
email     - mappedKeyName: EmailAddress
personID  - mappedKeyName: Id
--------
photos

And a Photo entity.

Photo
--------
image
createDate - mappedKeyName: Date
photoID    - mappedKeyName: Id
--------
owner (type Person) - mappedKeyName: UserId - relatedByAttribute: personID

还有其他相关的对象Person这些的 JSON 也是如此......

{
    ObjectId : blah,
    Owner : {
        Id : 12345asdfg,
        FullName : Oliver,
        EmailAddress : [email protected]
    }
}

有了这个 JSON,我的设置就可以进行导入了。任何不存在的人员记录(带有 ID)都会被创建。任何确实存在的都会被更新。

然而,照片 JSON 对象是这样的......

{
    Id : thisIsThePhotoID,
    Date : today,
    UserId : 12345asdfg
}

当物体像这样落下时,魔法记录导入在到达人物导入时停止。

代码崩溃于...

- (id) MR_relatedValueForRelationship:(NSRelationshipDescription *)relationshipInfo
{
    NSString *lookupKey = [self MR_lookupKeyForRelationship:relationshipInfo];
    return lookupKey ? [self valueForKeyPath:lookupKey] : nil;  // it stops here.
}

的价值lookupKey是@“personID”。

在断点处打印出关系信息给出...

$6 = 0x1fd695e0 (<NSRelationshipDescription: 0x1fd695e0>),
    name owner,
    isOptional 0,
    isTransient 0,
    entity Photo,
    renamingIdentifier owner,
    validation predicates (),
    warnings (),
    versionHashModifier (null)
    userInfo {
        mappedKeyName = UserId;
        relatedByAttribute = personID;
    },
    destination entity Person,
    inverseRelationship photos,
    minCount 1,
    maxCount 1,
    isOrdered 0,
    deleteRule 1

我真的不知道为什么这不起作用。我没有收到任何可报告的明显错误。


MagicalRecord 无法使用此 JSON 格式自动映射关系:

{
    Id : thisIsThePhotoID,
    Date : today,
    UserId : 12345asdfg
}

为了让 MagicalRecord 将关系映射到Person对象,它也必须是 JSON 中的对象,例如:

{
    Id : thisIsThePhotoID,
    Date : today,
    User : {
        UserId : 12345asdfg
    }
}

这样 MagicalRecord 就知道它是一个对象,并且它将在现有数据库中进行适当的查找Person记录上面的ID并映射关系。

不过,这有两个问题。如果您无法更改 JSON 输出,则必须在其上创建一个类别类Photo您自己手动映射关系。我将在第二期之后讨论这个问题。

第二个问题是,上述 JSON 格式假设您已经解析了用户并将记录存储在数据库中。如果还没有,MagicalRecord 将创建一个新的Person使用上述 ID 进行记录,但由于该对象上不存在其他属性(请注意 UserId 键是字典中的唯一属性),它将相当空,并且不包含姓名和电子邮件地址。您始终可以扩展 JSON(如果有可能)以将这些属性也包含在照片字典内的 Person 字典中:

{
    Id : thisIsThePhotoID,
    Date : today,
    User : {
        UserId : 12345asdfg,
        FullName : Oliver,
        EmailAddress : [email protected]
    }
}

JSON 有效负载非常小,因此如果可以的话这样做也没什么坏处。另外它只会创建一个新的Person记录数据库中是否尚不存在。

然后进行手动映射。如果您无法将 JSON 更改为上述格式,则必须手动覆盖关系映射,因为 JSON 未按照 MagicalRecord 进行映射的方式准备。

创建一个类别类Photo called Photo+Mapping.h/.m。我喜欢坚持+Mapping对于这些。那么班级应该是Photo (Mapping)在头文件和实现文件中,你就可以开始了。

MagicalRecord 有许多可供重写的实例方法(请参阅这篇关于 MagicalRecord 导入的文章由MagicalRecord的作者编写),其中有import<;attributeName>;: and import<;relationshipName>;:。还有一个willImport:, didImport: and shouldImport:类本身的方法允许您覆盖任何映射。

对于您的情况,您可以使用import<;relationshipName>;: or shouldImport:。我选择了这两个,因为其中一个有一点好处,具体取决于您是否已经映射了所有内容Person对象,并且它们可用于关系映射Photo object.

以下是您可以执行的操作示例(如果您愿意,可以选择将其中的一些操作组合起来,这样做也没什么坏处)。这里有一个注释:ALWAYS使用当前的NSManagedObjectContext当覆盖映射时(可以通过 MagicalRecord 轻松访问)self.managedObjectContext)否则你最终会遇到上下文问题。

请务必导入人员:

#import "Photo+Mapping.h"
#import "Person.h"

// Assuming you only want to import the Photo object if you already have a Person stored this is a great method to tell MagicalRecord whether to continue with importing or not
-(BOOL)shouldImport:(id)data {
    Person *person = [Person findFirstByAttribute:data[@"UserId"] value:@"personID" inContext:self.managedObjectContext];
    if (!person) {
        // no Person object exists so don't import the Photo object - again this is up to you since you might want to create the record if not
        return NO;
    }
    // you can set the relationship here (you might as well) or use the importPerson: method below (doing a second lookup, which is unnecessary at this point)
    [self setPerson:person];
    return YES;
}

// If you use this method you're doing the lookup to check whether a record exist when MagicalRecord is trying to map the Person relationship
-(void)importPerson:(id)data {
    Person *person = [Person findFirstByAttribute:data[@"UserId"] value:@"personID" inContext:self.managedObjectContext];
    if (!person) {
        // if no Person record exists for the associated UserId, you should create one (or not - if you choose not to, it's wise to throw away this Photo object)
        person = [Person createInContext:self.managedObjectContext];
        [person setPersonID:data[@"UserId"]];
    }
    // set the relationship
    [self setPerson:person];
}

// finally you can also use the following method when MagicalRecord is done mapping and get rid of the Photo object if the Person relationship is nil:
-(void)didImport:(id)data {
    if (!self.person) {
         [self deleteInContext:self.managedObjectContext];
    }
}

希望这可以帮助!如果您有任何疑问,请告诉我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

魔法记录导入(下一步) 的相关文章

  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图
  • iOS - 当 UIView 移动时将 UITextField 移动到不同的位置

    我有一个主 UIView 它通过开关向上移动 我有这个工作 那里没有问题 现在 UIView 当向下时 占据屏幕的大约一半 当它向上推时 它会显示底部 40px 在 UIView 中 当它处于向下状态时 它有一个 UITextField 并
  • 从命令行调试 iOS 应用程序构建

    我正在通过命令行构建 iOS 应用程序 但在调试它时遇到问题 如果我使用 XCode 进行构建 它会让我在设备上 构建和调试 而不会出现任何问题 但现在 我不知道如何使用 gdb 在设备上启动它并逐步执行它 如果我尝试 添加自定义目标 可执
  • Objective-c 中的块递归

    当执行涉及 Objective C 块的递归时 我在 iOS 应用程序中收到 EXC BAD ACCESS 信号 这是简化的代码 void problematicMethod FriendInfo friendInfo onComplete
  • 如何在 iOS 中更改部分透明图像的颜色?

    我有一个具有部分透明度的单色图像 我有正常版本和 2X 版本的图像 我希望能够用代码将图像着色为不同的颜色 下面的代码适用于普通图像 但 2X 最终会出现伪影 正常图像可能有类似的问题如果是这样 由于分辨率的原因我无法检测到它 UIImag
  • iOS 滚动视图允许滚动过去的内容

    我正在努力优化我的应用程序以适应横向和较小的屏幕 我主要使用滚动视图来实现这一点 在我的其中一个视图中 我有一个容器视图 当我在故事板中的设备之间切换时 这个容器视图看起来很完美 容器视图映射到具有滚动视图的视图控制器 该滚动视图的顶部 底
  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • 进入前台后刷新数据

    更改默认设置后 我想在AppDelegate中进入前台时刷新myViewController的数据 我所做的是 AppDelegate m void applicationDidFinishLaunching UIApplication a
  • 关于窗口层次结构的警告

    我的调试器中出现这样的警告 这是什么意思 Warning Attempt to present
  • 当强制退出/向上滑动以终止 iOS 应用程序而不点击横幅/警报时,如何获取推送通知有效负载?

    我正在构建一个应用程序来处理从 Parse 推送的通知 并尝试创建通知历史记录功能 我已经成功启用了后台模式 因此当应用程序在后台运行时 应用程序可以通过以下方式很好地获取有效负载application didReceiveRemoteNo
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发
  • 来自 iPhone/iPad 的 json Web 服务

    有人可以帮助我解决如何从 iphone 或 ipad 使用 json Web 服务的问题吗 这里我的要求是使用 API 密钥实现 json webservice 如果可能的话发布一些教程或示例链接 谢谢 规范的 JSON 处理库是here
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • 填充 CoreData 创建的 sqlite 数据库

    我有一个由 CoreData 模型自动创建的 sqlite DB 但我的应用程序不会让用户能够将数据写入其中 而是我想用程序所需的所有数据预先填充它 我的问题是 CoreData 创建的 sqlite DB 具有未知的表和字段 这些表和字段
  • 指定访问组时出现 KeychainItemWrapper 错误

    相当长一段时间以来 我一直在使用 KeychainItemWrapper 的 ARC 版本成功读取和写入私有钥匙串项目 我现在正在努力将我的 iOS 应用程序转换为使用共享访问组 以便我的 2 个共享相同应用程序前缀的应用程序可以访问钥匙串
  • 在现有 iOS 应用程序中集成 React-native(0.40.0) 后找不到 Yoga/Yoga.h 头文件

    在我的 Swift iOS 应用程序中集成 React Native 后 我无法构建 yoga Yoga h file cannot be found 我已经浏览了文档 查看了react native github页面 检查了类似问题的SO
  • iPhone 和加密库

    我想我必须在我的 iPhone 应用程序中使用加密库 我想问你有关苹果公司实施的加密货币出口政策的影响 我需要做一些额外的事情吗 例如填写表格等 1 如果我使用 MD5 进行哈希处理 2 如果我使用对称加密 Thanks EDIT 2009
  • 使用基于约束的布局自动调整 NSTokenField 的大小

    有没有办法自动调整大小height使用约束的 NSTokenField 保持宽度恒定 sizeToFit应该有效 但事实并非如此 如果我设置一个约束来保持宽度不变并调用此方法 它将忽略约束并仅调整宽度大小 当我想要的是仅调整高度大小时 基于
  • 分发内部业务 IOS 应用程序

    我遇到了 IOS 应用程序分发的一个令人困惑的部分 因此 我需要简单细分一下我的限制 即仅将我的应用程序分发给我的员工 同事或任何被视为 内部 的人 这是表明我不希望该应用程序出现在应用程序商店中的另一种方式 我的情况是我为几家公司开发 他
  • 苹果推送通知在生产中不起作用

    我们完全陷入困境 请帮忙 我和我的团队制作了一个 iPhone 应用程序 这是我们第一次在 iOS 上尝试 一切都很好 直到我们提交应用程序并在应用程序商店上可用为止 推送通知服务无法正常工作 我在网上搜索并尝试根据人们的建议仔细检查我们的

随机推荐

  • 调用方法时出错。无法启动 JVM - 本机包将构建但无法启动

    谁能更具体地说明我的问题所在以及如何解决它 我在跑 Windows 7的 Eclipse Mars 2 版本 4 5 2 我已经反复严格按照 Marco 的 code makery ch 教程 code makery ch library
  • 即使设备使用 WiFi,iOS 也会检查蜂窝技术是否可用

    这里需要一些帮助 我需要检测 iOS 设备是否 在某个时刻 具有蜂窝功能 无论是哪一个 我尝试使用可达性类别 但当用户连接到 WiFi 时问题就开始了 因为如果是这样的话 可达性无法检测到蜂窝网络 我也尝试使用这段代码 CTTelephon
  • 了解 jquery 回调

    我很难理解 javascript 回调应该如何工作 我使用以下代码从 MySQL 数据库获取值 post getResults php x 100 y 200 function arrayOfValues alert arrayOfValu
  • PHP 中字符串的每个单词都大写吗?

    据我所知 strtolower 使字符串全部小写 而 ucfirst 使字符串的第一个字母大写 我想问一下 是否可以将字符串中的每个单词都大写 示例 string hello world 如何使其显示为 Hello World 您正在寻找u
  • 带突出显示的 QML 嵌套列表视图

    我需要创建嵌套列表视图 如下所示 并用不同的颜色突出显示主列表和子列表 我尝试过使用 ListView 突出显示 但存在诸如显示子项和父项的突出显示之类的问题 如图所示 下图 我正在使用来自的代码here有一些小的修改 这是完整的代码 im
  • tkinter 在 for 循环中创建可点击标签[重复]

    这个问题在这里已经有答案了 我想在 for 循环中创建多个可点击标签 标签的结构类似于网格 具有 row 和 col 属性 如果我单击标签 则应使用 print it 函数打印单击标签的行和列 问题是 如果我单击任何标签 在这种情况下输出始
  • 在等待输入python时更新turtle/gui

    我正在制作一个聊天程序 但遇到一个问题 屏幕仅在输入后更新 我正在使用turtle来显示聊天 我知道 turtle对于这个目的来说并不是那么好 但它非常简单 这是我循环中的代码 while True ind userlist index u
  • 模拟器上的 Ionic3(Angular4) CORS

    我正在 genymotion 模拟器上测试 Ionic 3 应用程序 顺便说一句 由于 CORS http 请求不起作用 我以为服务器有问题 但我用ionic 2应用程序检查后确认服务器没有问题 Ionic 3 应用程序的 Http 请求在
  • 根据所选国家,需要填充州和城市

    HTML
  • 防止反应悬念隐藏内容

    我用谷歌搜索 观看了很多视频来实现类似 YouTube 加载的功能 如下面的屏幕截图所示 因此 我有基于路线的导航 其中有延迟加载 因此一切正常 但在加载内容时 反应悬念将使组件显示 无 因此它在屏幕上变得不可见 只有后备组件可见 我想让内
  • 在没有jquery的情况下更改页面滚动时的背景颜色?

    我试图让过渡工作 以便背景颜色根据页面 即位置淡入另一种颜色 由具有相同类的div触发 在这里找到了一些js http codepen io Funsella pen yLfAG 它在桌面上完全按照我想要的方式工作 但它在 iPad 上崩溃
  • Parallel.ForEach 与 HttpClient 和 ContinuousWith

    我有一个方法尝试从多个 URL 并行下载数据 并返回一个IEnumerable反序列化类型 该方法如下所示 public IEnumerable
  • 如何更改python字符串中最后一个字母的大小写?

    所以我想将字符串中的最后一个字符更改为小写 下面的代码是我用来向后打印字符串的方法 但是列表将最后一个字符保留为大写 我不知道如何解决这个问题 if s 1 x new last index len s 1 for i in range l
  • 插入符中的逻辑回归 - 无截距?

    使用 caret 包在 R 中执行逻辑回归 并尝试强制零截距 使得 x 0 处的概率为 0 5 在其他形式的回归中 似乎您可以使用unegrid关闭截距 但这没有逻辑回归的功能 有任何想法吗 model lt train y 0 x dat
  • 将wpf窗口打印到pdf文件

    我需要从 wpf 窗口构建 pdf 文件 该窗口包含一个带有一些绘图的画布以及一些带有数据的文本框和标签 一位朋友告诉我使用水晶报表 但对我来说似乎不是一个好的解决方案 我想在画布上打印图像并用文本框和标签的数据写入一些行 我需要一个非付费
  • 独立 VS 2010 C++ 程序

    我已经很久没有使用 VS 2010 和 C 了 当我重新开始使用它时 我遇到了去年困扰我的同样的问题 我编译的 exe 运行得不好没有正确的 C 运行时的旧机器 我什至不知道给他们什么链接 我告诉他们安装this他们收到错误消息 该程序无法
  • 如何在 AEM 6.1 中创建系统用户 (rep:SystemUser)?

    在 AEM 6 1 上 我尝试创建一个系统用户 rep SystemUser 谁能帮我 我需要这个系统用户映射到 OSGI 中的一个服务 我想用它来将一些数据写入 aem 内容 我可以在 CRX 中的以下位置看到 系统用户 home use
  • 在 C'# 中以编程方式获取所有 TFS 分支

    我正在尝试以编程方式获取 TFS for Visual Studio 2013 中所有分支的列表 经过一些研究 我发现此博客详细介绍了如何获取分支 显示 TFS 2010 中的所有分支层次结构 我修改了代码 将所有内容存储在列表中 priv
  • MPICH:如何发布_名称以便客户端应用程序可以查找_名称?

    在 Windows 1 4 1p1 中使用 MPICH 学习 MPI 时 我发现了一些示例代码here 最初 当我运行服务器时 我必须复制生成的port name并用它启动客户端 这样 客户端就可以连接到服务器了 我修改它以包括MPI Pu
  • 魔法记录导入(下一步)

    我在标题中添加了下一步 因为这与我之前的问题不同 标题几乎完全相同 我有一个Person entity Person name mappedKeyName FullName email mappedKeyName EmailAddress