RubyMotion 中 CoreData 迁移的问题

Posted

技术标签:

【中文标题】RubyMotion 中 CoreData 迁移的问题【英文标题】:problems with CoreData migrations in RubyMotion 【发布时间】:2012-11-09 01:38:49 【问题描述】:

我一直在研究如何在 RubyMotion 中使用 CoreData 进行架构迁移。

CoreData 架构迁移的问题在于,如果您是普通的 Obj-C ios 开发人员并且生活还不错,通常是通过 XCode 完成的。但由于我们使用的是 RubyMotion,因此我们必须手动执行此操作。

XCode CoreData 项目附带 xcdatamodel 文件,这些文件看起来像图表,显示应用程序的实体和属性,让您可以添加/修改它们。您可以创建版本化的 xcdatamodel 文件,并能够设置从一个版本到另一个版本的迁移;它提供了一种称为轻量级迁移http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweightMigration.html 的功能,只要迁移范围在其限制范围内,它就可以执行自动迁移。

这些功能仅在 XCode 和带有 xcdatamodel 文件的项目中可用。 我当前定义 CoreData 的属性和属性的实现都是在代码中定义的。但是这种方法不会让我们使用 XCode 方式来定义 CoreData 的结构,因此不会通过 XCode 提供迁移处理。 这里是潜在的方法我想出了到目前为止

    使用 xcdatamodel 文件定义 CoreData 的架构(实体、属性等)并使用 XCode 进行轻量级迁移。 Nitron 引用 xcdatamodel 文件来定义模型;我只是不知道怎么做。 (发布了一个问题,https://github.com/mattgreen/nitron/issues/27 https://github.com/mattgreen/nitron/issues/27以获得更多关于他的做法但尚未回答的洞察力。)还有一个名为XcodeProj https://github.com/CocoaPods/Xcodeproj的宝石,它看起来像你可以从Ruby与Xcode项目交互但是还没有让它发挥作用,也没有花费太多时间。

    在代码中进行手动迁移,这在理论上是可行的。我们需要的是原始 managedObjectModel 和目标 managedObjectModel 并按照“如果无法自动找到模型,请使用迁移管理器”http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweightMigration.html 中描述的步骤 这里的问题是如何获得原始 managedObjectModel。我们需要存储 NSManagedObjectModels 的所有版本,就像 ruby​​-on-rails 在 db/migrate/* 中所做的那样。拥有当前的 NSManagedObjectModel 和目的地的 NSManagedObjectModel,迁移是可能的。存储 NSManagedObjectModel 的所有版本的一种方式是在基于键值的持久性存储中。有一个很好的宝石,叫做 NanoStore https://github.com/siuying/NanoStoreInMotion,它可以让你存储数组和字典。例如,我们可以将每个版本存储在一个数组中,并以嵌套字典格式描述模式。我还没有编写代码来实现这一点,但我认为这是一种方法。

    去他妈的核心数据,然后继续使用基于键值的存储。 NanoStore 看起来非常强大,它是由 sqlite 支持的持久性数据存储。如自述文件所示,它可以创建具有属性的模型,能够find 事物,并且可以创建称为包的对象集合并使用它们进行操作。尽管与每个模型没有关系,但我们可以潜在地使用袋子来关联对象和/或我们可以定义我们自己的关系,比如我在这里怎么做https://gist.github.com/4042753

我倾向于键值存储,主要是因为它的简单性并且仍然具有持久性。它如何处理模式更改?它只是添加/删除现有数据的属性(如果您删除属性,则删除所有列,如果您向现有模型实例添加一个新属性,则为 nil)。这很糟糕吗?我不认为这是必要的,因为我们可以在必要时从服务器同步对象(我们的应用程序是基于服务器的应用程序)。

你怎么看?

【问题讨论】:

我们正在处理同样的困境,现在将尝试方法#1。恐怕#3将来会导致一致性和性能问题。 #3 还需要一些过程来管理数据库版本之间的迁移,所以还是需要解决原来的问题。在我们在某个地方找到一个可行的例子之前,#2 不是一个选项。 这就是让我最终坐下来写MotionModel的困境。 [刮牦牛] 【参考方案1】:

要创建 xcdatamodel 文件,您可以使用 ruby-xcdm,它可以轻松地以类似 ActiveRecord 的方式管理多个架构版本。

然后,来自同一作者的 Core Data Query 抽象出许多您需要手动处理的复杂性。

另一个资源来看看它this example 如何手动设置(轻量级)迁移,纯粹在代码中,无需 Xcode 的任何帮助。

Marcus Zarra 在 Core Data 2nd Edition 中还有一章介绍了如何设置迁移以使它们按顺序运行,从而降低了多个模式版本的复杂性。这是在 Objective-C 中,但将其移植到 RubyMotion 相对简单。

【讨论】:

以上是关于RubyMotion 中 CoreData 迁移的问题的主要内容,如果未能解决你的问题,请参考以下文章

删除开发中使用的 CoreData 迁移

RubyMotion 未加载 AudioToolbox 框架

在RubyMotion中使用@selector

在 CoreData 中迁移实体父级

Rubymotion 企业版

如何在 Swift 中进行轻量级 CoreData 迁移