Core Dataのすべてのクラスドキュメントを調べましたが、CoreDataエンティティの値をプログラムで更新する方法が見つかりません。たとえば、私はこれに似た構造を持っています:
id | title
============
1 | Foo
2 | Bar
3 | FooFoo
BarをBarBarに更新したいとしますが、どのドキュメントにもこれを行う方法が見つかりません。
Core Dataのすべてのクラスドキュメントを調べましたが、CoreDataエンティティの値をプログラムで更新する方法が見つかりません。たとえば、私はこれに似た構造を持っています:
id | title
============
1 | Foo
2 | Bar
3 | FooFoo
BarをBarBarに更新したいとしますが、どのドキュメントにもこれを行う方法が見つかりません。
Core Data では、オブジェクトはオブジェクトです。データベースはコマンドを投げるものではありません。
永続化されているものを更新するには、それをオブジェクトとして再作成し、更新して保存します。
NSError *error = nil;
//This is your NSManagedObject subclass
Books * aBook = nil;
//Set up to get the thing you want to update
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyLibrary" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"Title=%@",@"Bar"]];
//Ask for it
aBook = [[context executeFetchRequest:request error:&error] lastObject];
[request release];
if (error) {
//Handle any errors
}
if (!aBook) {
//Nothing there to update
}
//Update the object
aBook.Title = @"BarBar";
//Save it
error = nil;
if (![context save:&error]) {
//Handle any error with the saving of the context
}
Core Data でのマネージド オブジェクトの使用に関する Apple のドキュメントには、おそらく答えがあります。要するに、次のようなことができるはずです。
NSError *saveError;
[bookTwo setTitle:@"BarBar"];
if (![managedObjectContext save:&saveError]) {
NSLog(@"Saving changes to book book two failed: %@", saveError);
} else {
// The changes to bookTwo have been persisted.
}
(注:この例が機能するにbookTwo
は、関連付けられている管理対象オブジェクトである必要があります。)managedObjectContext
基礎となるリレーショナル データベースの観点から考えているように聞こえます。Core Data の API は、リレーショナル データベースではなく、モデル オブジェクトを中心に構築されています。
エンティティは Cocoa オブジェクト、つまりそのインスタンスNSManagedObject
またはそのサブクラスです。エンティティの属性は、オブジェクトのプロパティです。キーと値のコーディングを使用するか、サブクラスを実装する場合は、ドット構文またはアクセサー メソッドを使用してこれらのプロパティを設定します。
Evan DiBiase の回答は、プロパティ (具体的にはアクセサー メッセージ) を設定する 1 つの正しい方法を示しています。ドット構文は次のとおりです。
bookTwo.title = @"BarBar";
そして KVC (普通の古いもので使用できますNSManagedObject
):
[bookTwo setValue:@"BarBar" forKey:@"title"];
私があなたの質問を正しく理解していれば、管理対象オブジェクトは他の Cocoa クラスとまったく変わらないということだけを覚えておく必要があると思います。属性には、キー値コーディングまたはバインディングを介して、コードで使用できるアクセサーとミューテーターがあります。この場合のみ、コア データによって生成されます。唯一の秘訣は、setValue:ForKey: を使用する必要を避けたい場合、エンティティのクラス ファイル (ある場合) で生成されたアクセサーを手動で宣言する必要があることです。ドキュメントではこれについて詳しく説明していますが、簡単に言えば、データ モデル デザイナーで属性を選択し、[デザイン] メニューから [ Obj-C 2.0 メソッド宣言のコピー] を選択できます。
NSManagedObject *object = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectContext];
NSArray *temp = [[NSArray alloc]initWithObjects:@"NewWord", nil];
[object setValue:[temp objectAtIndex:0] forKey:@"title"];
// Save the context.
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
このコードからアイデアが得られると思います ;)