Edit
Core Dataとは。

Core Dataとは、簡単にいってしまえば、データをモデル(構造)ごと抽象化して、オブジェクトとして操作できるようにするフレームワークである。MVCモデルといわれるオブジェクト指向言語において、M(Model)にあたる。そのため、データ管理などの中心になる一般のデータベース用語とはネーミングルールに大きな違いがあり、最初は非常に理解に戸惑うものと思われる。

Edit
注意

Core Dataは、スレッドセーフではないので、スレッド化をする中に saveコマンドなどを実行する場合には、メインスレッドで処理を行う必要がある。

Edit
用語

上記で述べたようにデータ管理のフレームワーク故、用語は分かりづらいため、最初に用語の説明をする。

Edit
全体の用語

Edit
データの保存に関する用語

Coreデータでは抽象化されたデータにおける実際の外部記憶装置におけるファイルフォーマットについては、2種類しか存在しない。SQLite型、バイナリ型のみであり、SQLite型の場合は、データの一部だけをアクセスする仕組みが自動で組み込まれているが、バイナリ型の場合はすべてのデータを読み込んで利用する方式となるため、大量データにはSQLite型、高速アクセスにはバイナリ型となる。

Edit
データ取得に関する用語

いわゆるデータの個別操作においても、独自の用語とクラスとはなっているが、基本的にはSQLにおいてデータを取得するために必要なものと、大体同じ機能クラスを提供している。これはデータのモデルを抽象化しても、取得するデータアクセス方法にはあまり影響しないことが理由と思われる。

受信要求(fetchRequest)
感覚的にはSQL文を入れておくオブジェクトクラスといった機能であり、このオブジェクトには以下の要素が設定できる。

  1. エンティティの設定(1:エンティティ)
  2. 検索範囲の設定条件(2:述語)
  3. ソートの順番(3:ソート)
  4. 最大値の設定
  5. 最小値の設定
  1. エンティティ(NSEntityDescription)
    上記でも説明した通り、エンティティはSQLで言うところのテーブルの概念であり、データ取得の際にはエンティティクラスを設定する。
    NSEntityDescription * en = [NSEntityDescription entityForName:@"BookTable" inManagedObjectContext:context];
    これはBookTableというエンティティからデータを取得する宣言をしている。
  2. 述語(NSPredicate)
    この言い方も独特ではあるが、SQL文でいうところの条件文の設定をこのクラスで行い、上記の受信要求に設定してデータ取得を行うという点で、SQLとの特殊な違いは無い。通常この述語クラスは、下記のような文でその設定を作成する。
    NSPredicate * p = [NSPredicate predicateWithFormat:@"( group == %@ ) AND ( id > %d )", @"Ticket", 100];
    上の例ではグループ項目がTicketというデータで、且つ、idが100以上のデータという意味となる。
    但し、項目名を引数指定したい場合には特殊な指定を行う。
    NSString * propatyName = @"group";
    NSPredicate * p = [NSPredicate predicateWithFormat:@"%K == %@", propatyName, @"Ticket"];
    このように「%K」という特殊なフォーマット記号を利用する必要がある。これはNSStringのフォーマット機能と違い、基本的に%@で指定した文字列は、内部的には「'」シングルクォーテーションによって、無条件で囲う仕様となっているためである。
    他にも配列で条件を指定できる。
    NSArray * ary = [NSArray arrayWithObjects:@"Suzuki", @"Sato", @"Yamada", nil];
    NSPredicate * p = [NSPredicate predicateWithFormat:@"name IN %@", ary];
    ここでは、name項目が3人の名字と合致した場合となる。
    ほかにも数字などでの範囲指定も可能
    NSPredicate * p = [NSPredicate predicateWithFormat:@"id BETWEEN {100,200}"];
    これはid項目が100から200の間にある場合に対象となる。
    他にも文字比較の為に以下の演算子がある。
    演算子説明
    BEGINSWITH左辺は右辺の文字列で始まる(前方一致)
    CONTAINS左辺は右辺を含む(部分一致)
    LIKE左辺に含まれる「*」を複数文字無視、「?」を一文字無視として評価する。
    MATCHE左辺を正規表現処理する。(正規表現)
    [c]大文字小文字の区別をしない拡張演算子
    [d]付加記号を区別しない拡張演算子
    上記の例として以下の通り。(フォーマットの部分のみ表記)
    @"name LIKE[cd] '*shima?masa*'"
    これは〜shima masa〜という名前の人を探す述語表現
  3. ソート(NSSortDescriptor)
    これは呼んで字の如く、データ取得時のソートを指定するための設定クラスであり、SQL文でも利用されているものである。ソートクラスにおける例文は以下の通り。
    NSSortDescriptor * s = [NSSortDescriptor alloc] init initWithKey:@"bookid" ascending:YES];
    上の例ではbookidを昇順(YES)で取得するという意味となる。

Edit
データ管理に関する用語

管理オブジェクト(NSManagedObject)

Edit
利用の際の流れ

CoreData、いわゆる管理オブジェクトを利用するための流れは以下の通りとなる。

Edit
初期化

管理オブジェクトを利用するためには、いろいろな初期化から入らなければならない。特に特徴的なのはそれぞれの設定クラスが他クラスの従属クラスとして入れ子の状態となることである。

  1. NSManagedObjectContext(管理オブジェクト関係)の初期化 この管理オブジェクト関係クラスは、管理オブジェクトを統括して管理するオブジェクトクラスで、CoreDataにおける最初の定義し作成するクラスである。通常は下記のような初期化コードとなる。
    NSManagedObjectContext * context = [
  2. NSManagedObject(管理オブジェクト)の初期化 次に、実際のデータ操作を行う上での管理オブジェクトクラスを作成する。