まず、Apple のドキュメント (および Apple エンジニアからの繰り返しのコメント) が述べているように、Core Data は「高度な」Cocoa テクノロジです。コアデータをグロッキングするには、多くの Cocoa パラダイムとパターンに関する知識が必要です。真剣に、まずココアを学びましょう。次に、Core Data を使用せずにプロジェクト (または複数) を作成します。次にコアデータを学びます。真剣に。
あなたの好奇心を静めるために、CRUD の回答を試してみますが、それはあなたが望む回答にはなりません。答えは、コア データの CRUD パターンは存在しないということです。少なくとも、あなたが考えているようなものではありません。その理由は、Core Data がデータ アクセス レイヤーではないためです。オブジェクト グラフ管理フレームワークです。つまり、明示的で意図されたCore Data の仕事は、オブジェクト インスタンスのグラフを管理することです。このグラフには、制約 (関係のカーディナリティや個々のインスタンス属性に対する制約など) と、グラフを介して変更をカスケードするための規則 (削除など) があります。Core Data はこれらの制約を管理します。オブジェクト グラフは大きすぎてメモリに格納できない場合があるため、Core Data はオブジェクト グラフへのインターフェイスを提供します。これは、フォールトによってメモリ内のオブジェクト グラフ全体をシミュレートします[1] (オブジェクト インスタンスは、最初に管理対象に持ち込まれたときに「フォールト」ではありません)。オブジェクト コンテキストと、永続ストアから属性を遅延して入力するために「起動」される) および一意化 ((永続ストア内の) 特定のエンティティ インスタンスのメモリ内インスタンスが 1 つだけコンテキスト内に作成される)。
Core Data はたまたまディスク上の永続ストアを使用して、大きなオブジェクト グラフのインターフェイスを実装しています。SQLite 永続ストアの場合、この実装は単に行われますSQL 互換データベースを使用する。ただし、これは実装の詳細です。たとえば、ディスクに何も永続化しないが、Core Data が通常どおりオブジェクト グラフを管理できるようにするインメモリ永続ストアを作成できます。したがって、Core Data は実際にはデータ アクセス レイヤーではありません。このように考えると、その真の力を見失い、フラストレーションにつながります。任意のデータベース スキーマで Core Data を使用することはできません (これが、すべての Core Data チュートリアルが NSManagedObjectModel の作成から始まる理由です)。Core Data を永続化フレームワークとして使用したり、別のモデル レイヤーを使用したりしないでください。Core Data をモデル レイヤーとして使用し、モデルのオブジェクト グラフをディスクに永続化する Core Data の機能を利用する必要があります。
そうは言っても、NSManagedObjectContext(上で説明したオブジェクト グラフ インターフェイスを提供する)を作成するには、次のようにします。
NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:[NSBundle mainBundle]]]; // though you can create a model on the fly (i.e. in code)
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom];
NSError *err;
// add an in-memory store. At least one persistent store is required
if([psc addPersistentStoreWithType:NSInMemoryPersistentStore configuration:nil URL:nil options:nil error:&err] == nil) {
NSLog(@"%@",err);
}
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
[moc setPersistentStoreCoordinator:psc];
(ガベージ コレクションを使用していると仮定していることに注意してください。このコードは、手動のメモリ管理環境でリークします)。
エンティティ インスタンスを追加するには (moc上記の続き):
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc];
//entity will be nil if MyEntity doesn't exist in moc.persistentStoreCoordinator.managedObjectModel
NSManagedObject *obj = [[NSManagedObject alloc] initWithEntity:entity insertIntoManagedObjectContext:moc];
管理対象オブジェクトを作成するにはエンティティの説明が必要であり(チュートリアルがモデルから始まる理由)、管理対象オブジェクトのコンテキストがないと管理対象オブジェクトを作成できないことに注意してください。
エンティティ インスタンスを更新するには:
[obj setValue:myValue forKey:@"attributeKey"]; //or use any method on `obj` that updates its state
NSError *err;
if(![moc save:&err]) {
NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}
エンティティ インスタンスを削除するには:
[moc deleteObject:obj];
if(![moc save:&err]) {
NSLog(@"%@", err); // an erro occurred in saving, perhaps due to optimistic locking failure
}
[1]: バイナリまたは XML 永続ストアの場合、グラフ全体がメモリに格納されます。