在上面的代码中,您将 (UserNumber*) 转换为您声明为 (UserInfo*) 的对象?这是什么,你这样做有什么理由吗?
如果我正确理解您的问题,您希望创建一个仅预先填充用户名的记录,然后允许在稍后阶段更新该记录。
我假设您的实体名为 UserInfo,并且为它创建了 2 个 NSString 属性 - userName 和 position。我还假设您已经为 UserInfo 创建了类文件并将标题导入到相关的视图控制器中。
你会这样做:
1) 首先,假设您输入了UITextField *userNameField 的用户名,让我们创建一条新记录。
UserInfo *userInfo = (UserInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
[userInfo setValue:userNameField.text forKey:@"userName"];
这将在您的托管对象上下文中创建UserInfo 的新实例,并将userName 的值设置为userNameField.text 上的值
然后在稍后阶段,用户将可以更新他们在您的应用中的记录(您可能需要在此处考虑身份验证)。您将获取与您指定的用户名匹配的记录:
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSPredicate *userNamePredicate = [NSPredicate predicateWithFormat:@"(userName == %@)", userNameField.text];
[fetchRequest setPredicate:userNamePredicate];
NSEntityDescription *userInfo = [NSEntityDescription entityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:userInfo];
NSError *error;
NSArray *fetchRequestArray = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
如果 fetchRequest 发现与您的 userNameField.text 参数匹配,它们将保存在 fetchRequestArray 中。如果您采取必要步骤使userName 属性强制且唯一,则最多只能有一个对象。
通过抓取数组中的objectAtIndex:0 来访问对象并更改它的position 属性:
UserInfo *userInfoToBeEdited = [fetchRequestArray objectAtIndex:0];
[userInfoToBeEdit setValue:positionTextField.text forKey:@"position"];
在上述两种情况下,请记住在准备好提交更改时调用 CoreData 的保存方法。在调用 save 之前,您的更改仅保存在托管对象上下文中,这基本上是持久数据的便签本。
[编辑以添加保存方法]
根据您的评论,我的 AppDelegate 中通常有下面的保存方法(直接从 Apple 模板复制/粘贴)
- (void)saveContext
{
error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
[self seriousErrorAlert];
}
}
}
然后每当我需要保存更改时,我只需从任何视图控制器获取对我的 AppDelegate 的引用并将其关闭:
AppDelegate *theDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[theDelegate saveContext];