Xcode 8 では CoreData 用のファイルは automatic になったんだって (2)

CoreData が automatic になったことは既報の通りです。実際使用するにあたり、どういう違いが出てくるのか、実際プログラムして試してみました。

結論から言うと、automatic の方が便利です。理由は、開発の段では database の schema は変動的なので、フィールドの追加、フィールド名の変更などが頻繁に発生するもので、その度にファイルを作り直す必要がないので(コンパイル時に自動的に作ってくれるので)そこが便利。

あと、従来の方法で、フィールドの変更などが起こると、アプリ起動時にアプリが落ちてしまうことが大半で、お?何のエラー?意味わかんね?と言うことがしばしばでしたが、automatic なら、落ちることも少なくなり精神衛生上好ましいと思います。それではフィールド名の変更やフィールドの追加があったとするとどうなるのかと言うと、変更前のレコードはそのまま取り残され、次にデータを保存したタイミングでは新しいスキーマに基づいたレコードが保存されることになります。落ちなくなったものの、すでに保存してしまったデータを活かすなら従来通り migration は必要なので、そこは、注意が必要でしょうか。

それでは、新しい CoreData はどうやって使うかについて言及しましょう。まずヘッダーファイルで以下の指定をします。

#import <CoreData/CoreData.h>

#import "your_entity_name+CoreDataProperties.h"

データの追加は次のような形です。

AppDelegate* appdelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];

NSManagedObjectContext* context = appdelegate.persistentContainer.viewContext;

 

これで、context ができたので、データを保存するなら、こんな感じです。

NSManagedObject* entityNameObj = [NSEntityDescriptioninsertNewObjectForEntityForName:@"your_entity_name" 

                             inManagedObjectContext:context];

[entityNameObj setValue:mesg forKey:@"your_fieldname"];

[((AppDelegate*)[[UIApplication sharedApplication] delegate]) saveContext];

 

 

と言うわけで、

appdelegate.persistentContainer.viewContext

って何ですか?と言うのはありますが、これは覚えるしかないのでしょうね。