探している2番目の方法は、エンティティ自体に追加するのは適切ではありません。エンティティの上のどこかにある必要があります。ほとんどの場合、コントローラオブジェクトにあります。
最初の方法は次のとおりです。
- (void)updateDate:(NSDate*)date andValue:(NSInteger)value
{
[self setValue:date forKey:@"date"];
[self setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}
これはかなりストレートなKVC(Key-Value Coding)であり、このテーマに関するAppleのドキュメントを読むことを強くお勧めします。
コントローラ内にある必要がある他のメソッドの場合、レコードを見つけるためにフェッチを実行する必要があります。
- (id)findRecordForDate:(NSDate*)date inManagedObjectContext:(NSManagedObjectContext*)moc
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:moc]];
[request setPredicate:[NSPredicate predicateWithFormat:@"date == %@", date]];
NSError *error = nil;
NSArray *objects = [moc executeFetchRequest:request error:&error];
NSAssert1(error == nil, @"Error fetching object: %@", [error localizedDescription]);
return [objects lastObject];
}
- (void)incrementEntityWithDate:(NSDate*)date
{
id entity = [self findRecordForDate:date inManagedObjectContext:[self managedObjectContext]];
NSInteger value = [[entity valueForKey:@"value"] integerValue];
value += 1;
[entity setValue:[NSNumber numberWithInteger:value] forKey:@"value"];
}
これも非常に簡単なコアデータアクセスです。CoreDataがどのように機能するかを読むことをお勧めします。
余談ですが、日付を一意として使用することは非常に悪い設計です。
アップデート
マーカス、答えてくれてありがとう。本当に助かります。私はコアデータに慣れていないので、物事を明確にするためにいくつか質問があります。
最初のメソッドのコードは2つの値を設定しますが、新しいレコードをテーブルに挿入しません。新しく作成されたレコードをテーブルに挿入するにはどうすればよいですか?
CoreDataがどのように機能するかを読む必要があります。Appleには、Core Dataがどのように機能するかについての優れたドキュメントがあり、それが失敗した場合は、私の本を購入できます。インターネット上でCoreDataを使用する方法についての情報はたくさんあります。
最初の方法はどこに置くべきですか?私の.mファイルに?
これは基本的なObjective-Cです。この質問をしている場合は、一歩下がって、最初に言語の基礎を学ぶ必要があります。
コントローラに2番目のメソッドを追加する必要があるとおっしゃいました。ただし、コントローラーはxibファイルで定義されています。2番目の方法をそれに追加するにはどうすればよいですか?
コントローラがxibファイルで定義されることはありません。xibファイルで参照されます。繰り返しになりますが、これを深く掘り下げる前に、Objective-Cの仕組みの最初に戻って、基本を学ぶ必要があります。