2015/07/10

Core Data の使い方(1)

Core Data で簡単な(例:書籍のタイトルと著者)データベースを作ってアクセスする方法を紹介する。

  • XCodeでCoreDataのデータモデルを作成
  • Xcode のメニューの File -> New... から Data Model をクリックして Data Model ファイルを作成。デフォルトのファイル名は Model.xcdatamodeld。

    CD001

  • XCodeでCoreDataのデータモデルを作成
  • 1) モデルファイルを選択

    2) エンティテイ名を入力。この場合は "Book" 先頭は必ず大文字。

    3) "+" をクリックしてアトリビュートを追加

    4) アトリビュート名とタイプを入力。この場合は "auther" と "title"。必ず小文字。

    CD002

  • Storyboard で NSTableView を追加
  • View Controller に Table View をドラッグしてドロップ。

    CD003

  • Storyboard で View Controller に Array Controller を追加
  • View Controller に Array Controller をドラッグしてドロップ。

    CD004

  • View Controller と Array Controller を接続
  • ViewController.m に以下のコードを書いて、その IBOoulet とArray Controller を接続する。

    
    
    
    	IBOutlet NSArrayController *test_arrayController;
    
    
    
    

    1) Assistant Editor を開いて2画面にする。

    2) Storyboard で Array Contoroller を選択。

    3) Array Controller の Referencing Outlet と View Controller の IBOutlet を接続。

    CD005

  • Array Controller の Attribute を設定
  • 1) Model を "Entity Name" にする。

    2) Entitiy Name を入力。この場合は Model.cdatamodeld で設定した "Book"。

    3) Preparres Content にチェック。

    CD006

  • Table View の Content Mode を設定
  • Table View の Content Mode を "Cell Based"にする。

    CD007

  • Table View の title カラムと Modelの Attribute(データベースのレコード)を対応させる
  • 1) タイトルのカラムを選択。この場合は "TITLE" "

    2) Bind to "Array Controller" にチェック

    3) Model Key Path に Model で設定した Attributeを設定。この場合は "title"

    CD008

    4) "AUTHOR" "

    5) Bind to "Array Controller" にチェック

    6) Model Key Path に Model で設定した Attributeを設定。この場合は "author"

    CD009

  • ボタンを作る
  • レコードの追加と削除のボタン、データベースにセーブするボタンを Push Button で作る。

    CD010

  • レコード追加ボタンと "add:" を接続
  • Array Controller の "add" とレコード追加ボタンを接続する。

    CD011

  • 追加と同様に削除も作成
  • Array Controller の "remove:" とレコード削除ボタンを接続する。

    CD012

  • SAVE ボタンを接続
  • ViewController.m に 以下のコード書いてSAVE ボタンを接続。この状態ではSAVE できないが、後ほどコードを書き入れる。

    
    
    
    	- (IBAction)saveButton:(id)sender {
    
        
    
    	}
    
    
    
    

    CD013

  • ViewController.m にコードを書く
  • ViewContorller.m に以下のコードを書く。

    
    #import "ViewController.h"
    
    
    
    @interface ViewController ()
    
    @property (nonatomic) NSManagedObjectContext *managedObjectContext;
    
    @end
    
    
    
    @implementation ViewController {
    
    IBOutlet NSArrayController *test_arrayController;
    
    }
    
    
    
    - (void)viewDidLoad {
    
        [super viewDidLoad];
    
    
    
        NSError *error = nil;
    
    
    
        // Core Dataモデルファイルディレクトリの指定
    
        NSURL *modelURL =
    
            [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    
        NSManagedObjectModel* managedObjectModel =
    
            [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    
    
        // Core Dataのオブジェクト群の永続性を保証するNSPersistentStoreCoordinatorを扱うモデル情報
    
        // NSManagedObjectModelを指定して作成
    
        NSPersistentStoreCoordinator *coordinator =
    
            [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    
    
    
        // Core Dataが利用するファイルのパスを指定 ~/Documents/_deleteMe/NWCoreData.sqlite
    
        NSURL *storeURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
    
                            inDomains:NSUserDomainMask] lastObject];
    
        storeURL = [storeURL URLByAppendingPathComponent:@"_deleteMe/NWCoreData.sqlite"];
    
    
    
        // Persistent Store(永続ストア)設定
    
        if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
    
                URL:storeURL options:nil error:&error]) {
    
        NSLog(@"ERROR in addPersistentStoreWithType %@", [error localizedDescription]);
    
        }
    
    
    
        self.managedObjectContext = [[NSManagedObjectContext alloc] init];
    
        [self.managedObjectContext setPersistentStoreCoordinator:coordinator];
    
    
    
        [test_arrayController setManagedObjectContext:self.managedObjectContext];
    
    }
    
    
    
    - (IBAction)saveButton:(id)sender {
    
        NSError *error = nil;
    
        NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    
        if (managedObjectContext != nil) {
    
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
    
                NSLog(@"ERROR in saveContext %@", [error localizedDescription]);
    
            }
    
        }
    
    }
    
    @end

  • ビルドして実行
  • "+" ボタンでレコードが追加され、データ入力可能。"-" ボタンでレコードが削除できる。SAVEしてからアプリケーションを再起動するとデータがセーブされている。

    CD014