web-dev-qa-db-ja.com

CoreDataの属性をプログラムで更新する

Core Dataのすべてのクラスドキュメントを調べましたが、CoreDataエンティティの値をプログラムで更新する方法が見つかりません。たとえば、私はこれに似た構造を持っています:

 id  | title
============
  1  | Foo  
  2  | Bar  
  3  | FooFoo

BarをBarBarに更新したいとしますが、どのドキュメントにもこれを行う方法が見つかりません。

19
macinjosh

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.
}

(注:この例を機能させるには、bookTwomanagedObjectContextに関連付けられている管理対象オブジェクトである必要があります。)

24
Evan DiBiase

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
}
43
giff

基盤となるリレーショナルデータベースの観点から考えているようですね。 Core DataのAPIは、リレーショナルデータベースではなく、モデルオブジェクトを中心に構築されています。

エンティティはCocoaオブジェクトであり、NSManagedObjectのインスタンスまたはそのサブクラスです。エンティティの属性は、オブジェクトのプロパティです。キー値コーディングを使用するか、サブクラスを実装する場合は、ドット構文またはアクセサーメソッドを使用してこれらのプロパティを設定します。

Evan DiBiaseの回答は、プロパティを設定する1つの正しい方法、具体的にはアクセサメッセージを示しています。ドット構文は次のとおりです。

bookTwo.title = @"BarBar";

そしてKVC(これは昔ながらのNSManagedObjectで使用できます):

[bookTwo setValue:@"BarBar" forKey:@"title"];
8
Peter Hosey

私があなたの質問を正しく理解しているなら、あなたが心に留めておく必要があるのは、管理対象オブジェクトが他のCocoaクラスと実際に違いがないことだけだと思います。属性には、コード、キー値コーディング、またはバインディングを介して使用できるアクセサーとミューテーターがあります。この場合のみ、コアデータによって生成されます。唯一の秘訣は、setValue:ForKey:を使用する必要をなくしたい場合は、エンティティのクラスファイル(存在する場合)で生成されたアクセサーを手動で宣言する必要があることです。ドキュメントではこれについて詳しく説明していますが、簡単に言うと、データモデルデザイナで属性を選択し、[デザイン]メニューからObj-C 2.0メソッド宣言のコピーを選択できます。

6
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();
        }

私はこのコードがあなたにアイデアを与えると思います;)

2
NamshanNet