核心数据编辑属性

时间:2011-02-19 20:06:59

标签: iphone objective-c xcode core-data

所以对核心数据来说真的很新,但是我经历了一个教程并且非常了解它,至少是大多数事情背后的想法。但我还有一个问题,我无法找到任何地方。看起来很简单,但现在就是这样。如果我在一个实体中有两个字符串,请说:

1.name
2.position

如果已输入名称,我如何允许用户在textField中输入文本并在以后将其分配到自己的位置?即使有20个名字,考虑没有重复?

我当时认为它可能是这样的......但它似乎没有效果。

UserInfo *userInfo = (UserNumber *)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:managedObjectContext];

if ([userName isEqualToString:"@James"]) {
    userInfo.Position = nameField.text;
}

1 个答案:

答案 0 :(得分:7)

在上面的代码中,您将(UserNumber *)转换为您声明为(UserInfo *)的对象?这是什么,有什么理由你这样做?

如果我正确理解您的问题,您希望创建一个仅预先填充用户名的记录,然后允许该记录在稍后阶段更新。

我将假设您的实体名为UserInfo,并且为其创建了2个NSString属性 - userNameposition。我还假设您已经为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];