Iphone 核心数据编辑属性

Iphone 核心数据编辑属性,iphone,objective-c,xcode,core-data,Iphone,Objective C,Xcode,Core Data,所以我对核心数据真的很陌生,但我通过了一个教程,非常了解它,至少了解了大多数事情背后的想法。但我还有一个问题,我在任何地方都找不到。这看起来很简单,但在这里。如果我在一个实体中有两个字符串,让我们说: 1.姓名 2.职位 如果已经输入了名称,我如何允许用户在文本字段中输入文本,并在以后将其分配到他们的位置?即使有20个名字,考虑到没有重复 我在想它可能是这样的……但它似乎不起作用 UserInfo *userInfo = (UserNumber *)[NSEntityDescription in

所以我对核心数据真的很陌生,但我通过了一个教程,非常了解它,至少了解了大多数事情背后的想法。但我还有一个问题,我在任何地方都找不到。这看起来很简单,但在这里。如果我在一个实体中有两个字符串,让我们说:

1.姓名 2.职位

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

我在想它可能是这样的……但它似乎不起作用

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

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

在上面的代码中,您正在将UserNumber*强制转换为一个声明为UserInfo*的对象?这是什么?你为什么这么做

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

我将假设您的实体名为UserInfo,并且为它创建了两个NSString属性-userName和position。我还假设您已经为UserInfo创建了类文件,并将头导入到相关的视图控制器中

以下是您将如何做到这一点:

1首先,假设您在UITextField*userNameField中键入了username,让我们创建一个新记录

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并更改其位置属性来访问对象:

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];

在上面的代码中,您正在将UserNumber*强制转换为一个声明为UserInfo*的对象?这是什么?你为什么这么做

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

我将假设您的实体名为UserInfo,并且为它创建了两个NSString属性-userName和position。我还假设您已经为UserInfo创建了类文件,并将头导入到相关的视图控制器中

以下是您将如何做到这一点:

1首先,假设您在UITextField*userNameField中键入了username,让我们创建一个新记录

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并更改其位置属性来访问对象:

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];

这是将其保存回CoreData的正确方法吗?n错误*错误;如果[managedObjectContext save:&error]{}@JamesDunay刚刚添加了save方法,以及我将如何调用它来回答问题。希望有帮助!这是将其保存回CoreData的正确方法吗?n错误*错误;如果[managedObjectContext保存:&e
error]{}@JamesDunay刚刚添加了save方法,以及我将如何调用它来回答问题。希望有帮助!