核心数据 - 2 个对象模型,1 或 2 个托管对象上下文 - 哪个更好?

Posted

技术标签:

【中文标题】核心数据 - 2 个对象模型,1 或 2 个托管对象上下文 - 哪个更好?【英文标题】:core data - 2 object models , 1 or 2 managed object context - which would be better? 【发布时间】:2013-01-25 14:08:15 【问题描述】:

我正在开发一个小型 iPhone 记录应用程序,我希望将位置数据数据库与用户记录的数据分开。

我有几个理由将两者分开,包括

1) 我可能会通过应用更新推送定期位置数据更新,并且我不想冒险造成故障并影响用户数据。

2) 位置数据可能会使用户数据相形见绌,因此如果两者分开,同步和备份用户文件会更快。

因此,鉴于我打算拥有两个持久性存储,在性能和编码复杂性方面,一个上下文中包含两个持久性存储而不是 2 个独立的上下文,每个上下文都有自己的持久性存储,在性能和编码复杂性方面有优势还是劣势?

对此的任何想法都将不胜感激 - 在涉及到这些东西时我有点n00b - 在此先感谢

西蒙 .

【问题讨论】:

【参考方案1】:

我在我的应用程序中实现了类似的东西,我从 2 个数据库加载数据,因为我想将更新推送到某个数据集。

我的做法是使用 1 个对象模型、1 个托管对象上下文和 2 个持久存储,每个存储都加载不同的 sqlite 文件。为此,我在数据模型文件中创建了 2 个配置,然后将适当的实体拖到每个配置中。然后,当您创建持久存储时,请执行以下操作:

[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Configuration1" URL:store1URL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil] error:&error];
[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:@"Configuration2" URL:store2URL options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil] error:&error];

到目前为止,我发现的唯一问题是您不能在商店之间建立关系。 This answer 展示了如何使用获取的属性来复制关系。

希望这会有所帮助。

【讨论】:

感谢您提供其他答案的链接。我一直在考虑两个独立的模型,但我想我知道你在用一个模型做什么(大概是从每个持久存储中加载某些实体)。然而,它并没有回答单个上下文实现相对于两个单独的上下文是否具有性能优势的问题。对此有什么想法吗?【参考方案2】:

我实际上能够使用两个不同的 managedObjectContexts 与两个不同的模型和两个不同的持久存储使用同一个应用程序。

只需将它们加载到应用程序委托上,它们就可以在整个应用程序中使用。

我所做的是,我只是为第一个上下文复制并粘贴了完全相同的初始化默认代码,并将其重命名为新的上下文、存储和模型。

我为什么要这样做?我收到了一个完全独立的应用程序模块,我对它没有太多控制权,我不想弄乱我的应用程序的逻辑并能够将它保存在代码存储库的单独分支中,为主分支进行差异化提交和樱桃采摘增强。

【讨论】:

以上是关于核心数据 - 2 个对象模型,1 或 2 个托管对象上下文 - 哪个更好?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据迁移问题:“持久存储迁移失败,缺少源托管对象模型。”

核心数据:我的托管对象上的托管对象上下文为零

从 Git 中检索核心数据托管对象模型

继承托管对象

如何在核心数据中将非托管对象更改为托管对象

如何识别核心数据托管对象模型——哈希?