将 CoreData 存储在 iCloud 中
Posted
技术标签:
【中文标题】将 CoreData 存储在 iCloud 中【英文标题】:Store CoreData in iCloud 【发布时间】:2017-11-23 14:27:31 【问题描述】:我目前正在创建一个将客户数据存储在 CoreData 数据库中的 macOS 应用程序。
现在我希望将这些数据存储在 iCloud 中。这个想法是每个用户在他的 iCloud 中都有自己的数据。如果他使用不止一台 Mac/ios 设备,他可以访问他的数据。
所以我不是为所有客户集中数据存储,而是为每个客户单独存储数据。
我已经阅读了一些有关 CloudKit 的主题,但总体上对此感到困惑:
CloudKit 为全局数据提供数据存储(例如我要存储客户的数据) 是否有可能将 CoreData 记录到每个客户的 iCloud 帐户? 如果是这样,CloudKit 是否可以做到这一点,还是我必须使用像 Ensembles 这样的第三方库? (这提到 2016 年的一个帖子说 Apple 拒绝了通过 iCloud 使用 CoreData 的可能性,但现在只有像 Ensemble 这样的第 3 方库可以工作)有人可以告诉我他在这方面的经验吗?
谢谢
【问题讨论】:
数据库将被用户的iTunes账户隔离在iCloud中,因此只存储用户相关数据是理想的,不同的iCloud用户之间没有直接的网关共享数据;如果这符合您的概念,那么您真正必须担心的唯一一件事就是您打算如何解决 CoreData 中的冲突;剩下的就是茶杯中的风暴。 @holex 这正是我想要的。特定 iTunes/iCloud 帐户的用户只能看到他们的数据。那么这可以通过使用 CloudKit 来实现吗?或者您是否建议基于合奏之类的解决方案? 在这种情况下,您最大的挑战是仅在 CoreData 中建立解决 冲突 的策略,因为之后您只需将数据库保存到应用程序的 iCloud 容器中即可否则将由 iOS 在后台管理。我不建议为此使用任何 3rd 方的东西——仅仅因为你不需要它,它会增加复杂性(恕我直言)。 【参考方案1】:CloudKit 相当广泛。它提供了三种类型的数据库:
-
公开,所有人都可以共享。
私人,特定于一个 iCloud 帐户。
共享,这是某人的私人数据库,但您已获得访问权限。
这为您提供了很多选择,而且您所询问的情况(在单个 iCloud 用户的设备之间共享数据的情况)非常适合私人数据库。换句话说,CloudKit 非常适合您。
正如其他人已经说过的,CloudKit 为您提供了在设备之间移动数据所需的在线存储,但它没有为此提供完整的机制。这就是像Ensembles 这样的框架出现的地方;它们建立在 CloudKit 和其他服务之上,以处理使两个设备在时间和空间上保持同步所涉及的所有簿记。 (免责声明:我是 Ensembles 框架的开发者。)
您不必使用像 Ensembles 这样的框架;您可以直接与 CloudKit 通信,但您不应低估开发与 Core Data 完全同步的应用程序需要多少时间和技能。根据您的数据集,可能会有很多问题。集成和类似的框架为你做了很多:
确保在每台设备上以相同的顺序播放更改 处理两个不同设备上的并发更改 删除旧数据和冗余数据 通过提供批处理来降低内存使用率,这在 iOS 上非常重要简而言之,你可以自己做,但我不建议这样做。如果你想要 Core Data 同步,我推荐 Ensembles,或者查看其他库,如 Seam(我没有使用过,但它似乎很受欢迎)。
如果您没有使用 Core Data,您可以查看 Realm 和 Firebase 之类的选项,它们可以一键有效地处理同步问题和客户端 API。
【讨论】:
感谢您的回答。 Realm 和 Firebase 是否支持私有数据库场景? 我对他们没有任何经验,但我相信是的。以上是关于将 CoreData 存储在 iCloud 中的主要内容,如果未能解决你的问题,请参考以下文章
CoreData 不会在存储播种后立即将数据上传到 iCloud
可以在 coredata 中存储 jpg 图像使 iCloud App 更容易