我正在努力编辑/保存Core Data,并需要一些帮助。我正在使用NSFetchedResultsController并且在Core Data中有一个名为Golfer的实体,其中包含attributes- first_name,last_name,email_id和其他实体。所以,我知道如何在数据库中添加和删除高尔夫球手。
我正在研究一个名为ViewManager的视图控制器(我所有类的基本视图),里面有2-3个自定义UIViews。每当我需要它时,我就会将它们设置为动画。
我将一个高尔夫球手添加到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;
}];
}
答案 0 :(得分:1)
如果我已正确阅读此代码,则调用-(IBAction)saveEditGolfersView:(id)sender
会为所有高尔夫球手设置确切的属性,我希望这不是您想要的。
我不太确定问题是什么,但我假设您需要NSPredicate
与您的NSFetchRequest
一起更改正确的高尔夫球手。
也许我错过了什么,但是这段代码告诉我“嘿,我要加载数据库中的所有高尔夫球手,按照他们的名字命名,然后将他们所有的属性设置为完全相同的文本本页面上的字段“。听起来像坏消息......
要编辑一个高尔夫球手,请确保将正在编辑的高尔夫球手存放在某个位置的属性中。由于您将managedObjectContext保存在applicationDelegate中,因此它将保持活动状态,从而使您的核心数据对象保持活动状态。这样可以避免在保存视图中执行昂贵的提取操作。但是,如果您不想保留对高尔夫球手对象的引用,则每个NSManagedObject
都有objectId
,这是核心数据使用的标识符。您可以在fetch谓词中使用objectId
,如下所示:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"objectId == %@", self.editingGolferObjectId];
[request setPredicate:predicate];
我会选择继续引用您案例中的对象,而不是objectId