所以对核心数据来说真的很新,但是我经历了一个教程并且非常了解它,至少是大多数事情背后的想法。但我还有一个问题,我无法找到任何地方。看起来很简单,但现在就是这样。如果我在一个实体中有两个字符串,请说:
1.name
2.position
如果已输入名称,我如何允许用户在textField中输入文本并在以后将其分配到自己的位置?即使有20个名字,考虑没有重复?
我当时认为它可能是这样的......但它似乎没有效果。
UserInfo *userInfo = (UserNumber *)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:managedObjectContext];
if ([userName isEqualToString:"@James"]) {
userInfo.Position = nameField.text;
}
答案 0 :(得分:7)
在上面的代码中,您将(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方法。在调用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];