4

我一直在阅读一些关于使用核心数据保存的帖子。我注意到大多数时候每个人都忘记了最难的部分是对象的编辑而不是创建。

我阅读了 3 本关于核心数据的不同书籍,我将与您分享这些书籍使用的所有方法。我很想知道您会为自己的申请采用哪种方法。



Core Data iOS Essentials - Packt Publishing

有一个 RootVC、一个 AddCustomerVC 和一个 EditCustomerVC。我们要创建或编辑客户


1) 用户单击 RootVC 中
的添加按钮 2) 添加按钮方法创建一个对象并将其设置为 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实例属性并调用委托方法

-(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];
}




适用于 iOS 的 Pro Core Data - Apress

我们有一个 MasterVC 和一个 TeamVC,我们可以在其中创建和编辑一个团队


1) 当用户单击 ADD 按钮时,它会调用 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;
}



( _
_看看你是否通过了一个团队,所以如果你正在添加或编辑)并调用主控制器的保存或插入方法

-(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 - 核心框架系列

这被认为是关于核心数据的最佳书籍之一,即使它已经过时了,但它有一个完全不同的方法

我们有一个 RootVC 和一个 PersonEditorVC 我们可以添加和编辑 Person

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 打开 n 设置其文本字段,如果人员不为零,然后从每个 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 编辑)如果用户想要编辑一个人并单击表中的人行,它会被称为 tableview 方法,它只是调用 setCurrentPerson 和一个人

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    AWPerson *selectedPerson = [self.fetchedResultsController objectAtIndexPath:indexPath];

    [self.personEditorViewController setCurrentPerson:selectedPerson];

    [self.navigationController pushViewController:self.personEditorViewController animated:YES];
}



结论

在这里,我们有 3 种完全不同的方法,来自 3 本关于 Core Data 的最佳书籍。

你最喜欢哪种方法?你用不同的吗?为什么你比另一个更喜欢一个?

我个人认为最后一个是最好的,即使它更容易编码,它肯定是最好的语法,更可重用等等。但对于一个小应用程序,我可能会使用第一个。

4

0 回答 0