我一直在研究如何在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文件来定义模型;我只是不知道怎么样。 (向Nitron https://github.com/mattgreen/nitron/issues/27的作者发布了一个问题,以便更深入地了解他是如何做到的,但还没有回应。)还有一个叫做Xcodeproj https://github.com/CocoaPods/Xcodeproj的宝石看起来像你可以与XCode交互来自红宝石的项目,但没有使它工作也没有花很多时间。
在代码中进行手动迁移,这在理论上是可行的。我们需要的是原始的managedObjectModel和目标managedObjectModel,并按照“如果无法自动找到模型使用迁移管理器”中描述的步骤http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweightMigration.html 这里的问题是如何获得原始的managedObjectModel。我们需要存储所有版本的NSManagedObjectModel,就像ruby-on-rails在db / migrate / *中的做法一样。拥有当前的NSManagedObjectModel和目标的NSManagedObjectModel,可以进行迁移。存储所有NSManagedObjectModel版本的一种方法是基于键值的持久性存储。有一个很棒的宝石叫做NanoStore https://github.com/siuying/NanoStoreInMotion,它允许你存储数组和字典。因此,我们可以将每个版本存储在一个数组中,并以嵌套字典格式描述模式。我没有做过编码来练习,但我认为这是一种方法。
他妈的coredata继续使用基于键值的存储。 NanoStore看起来非常强大,它是持久性数据存储,由sqlite支持。正如自述文件所示,它可以创建具有属性的模型,能够find
个东西,并且可以创建一个名为bags的对象集合并使用它们进行操作。虽然与每个模型没有任何关系,但我们可以使用行李来关联对象和/或我们可以定义自己的关系,就像我在这里做的那样https://gist.github.com/4042753
我倾向于键值存储,主要是因为它的简单性,但仍然具有持久性。它如何处理架构更改?它只是向现有数据添加/删除属性(如果删除属性则删除所有列,如果向现有模型实例添加新属性则删除nil)。这不好吗?我不认为这是必要的,因为我们可以从服务器同步对象(我们的应用程序是基于服务器的应用程序)。
你觉得怎么样?答案 0 :(得分:0)
要创建xcdatamodel文件,您可以使用ruby-xcdm,这样可以轻松地以类似ActiveRecord的方式管理多个架构版本。
然后从同一作者那里得到Core Data Query,它会抽象出你需要手动处理的很多复杂性。
另一个资源,可以手动查看this example如何手动设置(轻量级)迁移,纯粹是在代码中没有Xcode的任何帮助。
Marcus Zarra还提供了Core Data 2nd Edition中的一章,它将指导您如何设置迁移以使它们按顺序运行,这样一旦您有多个模式版本,就会降低复杂性。这是在Objective-C中,但将它移植到RubyMotion是相对简单的。