コアデータでの保存に関する投稿をいくつか読んでいます。ほとんどの場合、最も難しい部分はオブジェクトの作成ではなく編集であるということを誰もが忘れていることに気付きました。
私はコアデータについて 3 冊の本を読みました。それらの本で使用されているすべての方法を紹介します。そして、あなた自身のアプリケーションにどのアプローチを適用するか知りたいです.
Core Data iOS Essentials - Packt パブリッシング
RootVC、AddCustomerVC、EditCustomerVC があります。Customer を作成または編集したい
1) ユーザーが RootVC の [ADD] ボタンをクリックする
2) [add] ボタン メソッドがオブジェクトを作成し、それを DetailVC の Object *myobject 変数として設定する
-(IBAction) addCustomer {
AddCustomerVC *addVC = [AddCustomerVC alloc]init];
addVC.customer = (Customer *) [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:self.managedObjectContext];
addVC.delegate = self;
[self.navigationController presentModalViewController:addVC animated:YES];
}
3) detailVC が Customer インスタンス属性を設定し、delegate メソッドを呼び出す
-(IBAction) save {
customer.name = newName.text;
customer.surname = newSurname.text;
[delegate addVC:self selectedSave:YES];
}
4) ユーザーが addVC で [キャンセル] を押すと、アクションはデリゲート メソッドを呼び出します。
-(IBAction) cancel {
[delegate addVC:self selectedSave:NO];
}
5) RootVCデリゲートの実装は、ユーザーがコンテキストを保存して保存したかどうかを確認します
-(void) addVC:(UIViewController *)controller selectedSave:(BOOL)save {
if(!save) {
[self.managedObjectContext deleteObject:controller.customer];
}
NSError *error = nil;
if( ! [self.managedObjectContext save:&error] ) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self dismissModalViewControllerAnimated:YES];
}
1編集)ユーザーがセルをクリックすると、セル選択のメソッドが呼び出され、選択した値で顧客が作成され、EditVCが開きます
-(void)tablewView:(UITableView *)tableview didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
EditCustomerVC editVC = [[EditCustomerVC alloc]init];
Customer *selectedCustomer = (Customer *) [self.fetchedResultsController objectAtIndexPath:indexPath];
editVC.customer = selectedCustomer;
[self.navigationController pushViewController:editVC animated:YES];
}
2編集)ユーザーは保存ボタンを押し、顧客の値を設定し、デリゲートを呼び出します
-(IBAction) save {
customer.name = name.text;
customer.surname = surname.text;
[delegate editVC:self selectedSave:YES];
}
3b) ユーザーがキャンセルを押すと、デリゲートが呼び出されます
-(IBAction) cancel {
[delegate editVC:self selectedSave:NO];
}
4b) デリゲートは編集したオブジェクトを保存します
.(void)editVC:(UIViewController *)controller selectedSave:(BOOL)save {
if(save) {
NSError *error = nil;
if( ! [self.managedObjectContext save:&error] ) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self dismissModalViewControllerAnimated:YES];
}
Pro Core Data for iOS - Apress
チームを作成および編集できるMasterVCとTeamVCがあります
1)ユーザーが[追加]ボタンをクリックすると、showTeamVCが呼び出され、MasterVCとチームが渡されます
-(void)showTeamVC {
TeamVC *teamVC = [[TeamVC alloc]initWithController:self andTeam:nil];
[self presentModalViewController:teamVC animated:YES];
}
2) TeamVC の init は、渡された値をその iVar として設定します。
-(id)initWithController:(UIViewController *)controller andTeam:(Team *)team {
self.controller = controller;
self.team = team;
}
3) viewDidLoad は、オブジェクトから取得した値を使用してビューのフィールドを設定します。
4) ユーザーがキャンセルを押すと、コントローラーは単に閉じられ
ます。 5) ユーザーが保存をクリックすると、 team が nil (チームに合格したかどうかを確認するため、追加または編集している場合)、マスターコントローラーの保存または挿入メソッドを呼び出します
-(IBAction)save {
if ( team != nil ){
team.name = nameTextField.text;
team.colors = colorsTextField.text;
[controller saveContext];
} else {
[controller insertTeamWithName: nameTextField.text andColors:colorsTextField.text];
}
[self dismissModalViewControllerAnimated:YES];
}
6) 新しいチームを保存した場合、MasterVC の insertTeamWithName:andColors メソッドと呼ばれます。
-(void)insertTeamWithName:(NSString *)name andColors:(NSString *)colors {
NSManagedObjectContext *contextx = [self.fetchedResultsController managedObjectContext];
Team *newTeam = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:context];
[self saveContext];
}
7) チームを編集した場合、MasterVC で saveContext メソッドが呼び出されます。
-(void)saveContext {
NSManagedObjectContext *context = [self.fetchedResultsController managedObjectcontext];
NSError *error = nil;
if ( ! [context save:&error] ) {
NSLog(@"Error");
}
}
Core Data for iOS - コア フレームワーク シリーズ
これは、コア データに関する最良の本の 1 つと考えられています。
Person を追加および編集できる RootVC と PersonEditorVC があります。
1) rootVC ボタンの追加が押されると、PersonEditorVC で setCurrentPerson:nil メソッドが呼び出され、そのビューが開きます。
- (void)addNewPerson {
[self.personEditorViewController setCurrentPerson:nil];
[self.navigationController pushViewController:self.personEditorViewController animated:YES];
}
2) PersonEditorVC メソッド setCurrentPerson が前のメソッドによって呼び出されます。person が nil の場合は Person イニシャライザを呼び出し、 person が nil でない場合は objectID を取得します
- (void)setCurrentPerson:(AWPerson *)aPerson {
if( !aPerson )
{
self.title = @"Add person";
aPerson = [AWPerson
personInManagedObjectContext:self.editingContext];
}
else if( [aPerson managedObjectContext] != self.editingContext ) {
self.title = @"Edit person";
aPerson = (id)[self.editingContext
objectWithID:[aPerson objectID]];
}
if( currentPerson != aPerson ) {
[currentPerson release];
currentPerson = [aPerson retain];
}
}
3) PersonEditorVC を開き、その人物が nil でない場合はそのテキスト フィールドを設定し、各 textFieldShouldReturn でテキスト フィールドから編集された値を取得します。
- (void)textFieldDidEndEditing:(UITextField *)textField {
if( textField == self.firstNameTextField )
[self.currentPerson setFirstName:textField.text];
else if( textField == self.lastNameTextField )
[self.currentPerson setLastName:textField.text];
[self becomeFirstResponder];
}
4) ユーザーがキャンセルを押すと、古いコントローラーに戻ります。保存を押すと、コンテキストが保存されます。
- (IBAction)savePerson:(id)sender {
NSError *anyError = nil;
BOOL success = [[currentPerson managedObjectContext]
save:&anyError];
if( !success ) {
UIAlertView *errorAlert = [[UIAlertView alloc]
initWithTitle:@"Couldn't save this person"
message:[anyError localizedDescription]
delegate:self cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[errorAlert show];
}
else {
[self.navigationController popViewControllerAnimated:YES];
}
}
5) 自動生成されたモデル クラスに記述されているイニシャライザに注意することが重要です。
+ (id)personInManagedObjectContext:(NSManagedObjectContext *)moc {
return [NSEntityDescription
insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:moc];
}
1編集)ユーザーが人を編集してテーブルの人の行をクリックしたい場合、それは人でsetCurrentPersonを呼び出すだけのtableviewメソッドと呼ばれます
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
AWPerson *selectedPerson = [self.fetchedResultsController objectAtIndexPath:indexPath];
[self.personEditorViewController setCurrentPerson:selectedPerson];
[self.navigationController pushViewController:self.personEditorViewController animated:YES];
}
結論
ここでは、Core Data に関する最高の 3 冊の本から、3 つのまったく異なるアプローチを取り上げます。
あなたのお気に入りのアプローチはどれですか?別のものを使用しますか?なぜあなたは他の人よりも好きですか?
個人的には、最後のものが最高だと思います。たとえコーディングが簡単でなくても、それは確かに最高の構文であり、より再利用可能であるなどです。しかし、小さなアプリの場合、おそらく最初のものを使用します。