1

我一直在研究如何在 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 提供迁移处理。这是我到目前为止提出的潜在方法

  1.  使用 xcdatamodel 文件定义 CoreData 的模式(实体、属性等)并使用 XCode 进行轻量级迁移。Nitron 正在引用 xcdatamodel 文件来定义模型;我只是还不知道怎么做。(向 Nitron 的作者发布了一个问题  https://github.com/mattgreen/nitron/issues/27  以更深入地了解他是如何做到的,但还没有回应。)还有一个名为 Xcodeproj 的 gem   https:// github.com/CocoaPods/Xcodeproj  看起来你可以从 ruby​​ 与 XCode 项目进行交互,但没有让它工作,也没有花费太多时间。

  2.  在代码中进行手动迁移这在理论上是可能的。我们需要的是原始 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 的一种方法是基于键值的持久性存储。有一个不错的 gem,叫做 NanoStore   https://github.com/siuying/NanoStoreInMotion,它可以让你存储数组和字典。例如,我们可以将每个版本存储在一个数组中,并以嵌套字典格式描述模式。我还没有完成编码来练习它,但我认为这是一种方法。

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

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

你怎么看?

4

1 回答 1

0

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

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

另一个资源来看看这个例子,如何手动设置(轻量级)迁移,纯粹在代码中,没有 Xcode 的任何帮助。

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

于 2014-01-20T04:55:52.890 回答