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 の属性とプロパティを定義する現在の実装は、すべてコードで定義されています。しかし、このアプローチでは CoreData の構造を定義する XCode の方法を使用できないため、XCode を介した移行処理は提供されません。ここに私がこれまでに思いついた潜在的なアプローチがあります
xcdatamodel ファイルを使用して CoreData のスキーマ (エンティティ、プロパティなど) を定義し、XCode を使用して軽量の移行を行います。Nitron はモデルを定義するために xcdatamodel ファイルを参照しています。まだ方法がわかりません。(Nitron https://github.com/mattgreen/nitron/issues/27の作成者に質問を投稿して、 彼がそれを行う方法についてより多くの洞察を得ましたが、まだ応答はありません。) Xcodeproj という gem もあり ます https:// github.com/CocoaPods/Xcodeproj は、Ruby からXCode プロジェクトを操作できるように見えますが、まだ機能しておらず、多くの時間を費やしていません。
コードで手動で移行を行う これは理論的には可能です。必要なのは、元の managedObjectModel と宛先の managedObjectModel であり、「モデルが自動的に見つからない場合は移行マネージャーを使用する」 http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/で説明されている手順に従います。 CoreDataVersioning/Articles/vmLightweightMigration.html ここで問題になるのは、元の managedObjectModel を取得する方法です。ruby-on-rails が db/migrate/* で行うのと同じように、NSManagedObjectModels のすべてのバージョンを保存する必要があります。現在の NSManagedObjectModel と移行先の NSManagedObjectModel があれば、移行が可能です。NSManagedObjectModel のすべてのバージョンを格納する 1 つの方法は、キー値ベースの永続ストレージです。配列と辞書を保存できるNanoStore https://github.com/siuying/NanoStoreInMotionという素晴らしい宝石があり ます。そのため、たとえば、各バージョンを配列に格納し、ネストされた辞書形式でスキーマを記述することができます。私はそれを実行するためのコーディングを行っていませんが、これは 1 つのアプローチであると推測しています。
コアデータをファックして、キー値ベースのストレージに進みます。NanoStore は非常に強力に見え、sqlite に支えられた永続的なデータ ストレージです。readme に示されているように、属性を持つモデルを作成し
find
たり、さまざまな操作を実行したり、バッグと呼ばれるオブジェクトのコレクションを作成したり、それらを操作したりできます。各モデルとの関係はありませんが、バッグを使用してオブジェクトを関連付けたり、独自の関係を定義したりできます 。
主にそのシンプルさのためにキー値ストアに傾倒していますが、それでも永続性があります。スキーマの変更をどのように処理しますか? 既存のデータに属性を追加/削除するだけです (属性を削除する場合はすべての列を削除し、既存のモデル インスタンスに新しい属性を追加する場合は nil を削除します)。これは悪いですか?必要に応じてサーバーからオブジェクトを同期できるので、それが悪いとは思い ません (私たちのアプリはサーバーベースのアプリです)。
どう思いますか?