1

我正在努力编辑/保存核心数据,需要一些帮助。我正在使用 NSFetchedResultsController 并在 Core Data 中有一个名为 Golfer 的实体,其属性包括 first_name、last_name、email_id 和其他属性。所以,我知道如何在数据库中添加和删除高尔夫球手。

我正在开发一个名为 ViewManager 的视图控制器(我所有类的基本视图),它里面有 2-3 个自定义 UIView。每当我需要它们时,我都会为它们设置动画。

我将高尔夫球手添加到 tableview,然后在 didSelectRow tableview 方法上,我在同一个 ViewManager 控制器中显示我的编辑视图,并尝试使用以下代码更新编辑视图中的文本字段,但它在 tableview 中的随机索引处更新,而不是为我工作。任何帮助将不胜感激。

- (IBAction)saveEditGolfersView:(id)sender
{
    AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
    NSManagedObjectContext * context = [applicationDelegate managedObjectContext];

    // Retrieve the entity from the local store -- much like a table in a database
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Golfer" inManagedObjectContext:context];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity]; 

    // Set the sorting -- mandatory, even if you're fetching a single record/object
    NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"first_name" ascending:YES];

    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,nil];
    [request setSortDescriptors:sortDescriptors];
    [sortDescriptors release]; sortDescriptors = nil;
    [sortDescriptor1 release]; sortDescriptor1 = nil;

    NSError * error;

    NSArray * objects = [context executeFetchRequest:request error:&error];

    for(int i = 0; i<[objects count]; i++)
    {
        Golfer * golfguy = [objects objectAtIndex:i];

        golfguy.first_name = mEditFirstName.text;
        golfguy.middle_name = mEditMiddleName.text;
        golfguy.last_name = mEditLastName.text;
        golfguy.email_id = mEditEmailField.text;
        golfguy.contactNumber = mEditContactNum.text;
        golfguy.picture = mEditPictureView.image;

        NSLog(@"name-%@", golfguy.first_name);
    }

    [request release]; request = nil;

     error = nil;
    [context save:&error];

    [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveEaseOut

                     animations:^ {

                         mEditGolfersView.frame = CGRectMake(-480, mEditGolfersView.frame.origin.y, mEditGolfersView.frame.size.width, mEditGolfersView.frame.size.height);

                     }

                     completion:^(BOOL finished) {
                         mEditGolfersView.hidden = YES;

                     }];
}
4

1 回答 1

1

如果我已正确阅读此代码,那么调用-(IBAction)saveEditGolfersView:(id)sender将设置所有 Golfers 的确切属性,我预计这不是您想要的。

我不太确定问题出在哪里,但我假设您需要一个NSPredicate和您一起NSFetchRequest去更换正确的高尔夫球手。

也许我错过了一些东西,但是这段代码对我说:“嘿,我将在数据库中加载所有 Golfer,按他们的名字排序,然后将它们的所有属性设置为完全相同的文本字段页”。只是听起来像个坏消息...

要仅编辑一名高尔夫球手,请务必将您正在编辑的高尔夫球手存储在某个地方的属性中。由于您将 managedObjectContext 存储在 applicationDelegate 上,因此它将保持活动状态,从而使您的核心数据对象保持活动状态。这将避免您在保存视图中进行的昂贵的获取。但是,如果您不想保留对高尔夫球手对象的引用,则每个对象NSManagedObject都有一个objectId,这是核心数据使用的标识符。您可以objectId像这样在 fetch 谓词中使用:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId == %@", self.editingGolferObjectId];
[request setPredicate:predicate];

在您的情况下,我会选择保留对对象的引用,而不是objectId

于 2012-04-20T00:22:35.003 回答