【问题标题】:Core Data Edit Attributes核心数据编辑属性
【发布时间】:2011-06-30 12:09:54
【问题描述】:

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

1.名称
2.位置

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

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

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

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

【问题讨论】:

    标签: iphone objective-c xcode core-data


    【解决方案1】:

    在上面的代码中,您将 (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 之前,您的更改仅保存在托管对象上下文中,这基本上是持久数据的便签本。

    [编辑以添加保存方法]

    根据您的评论,我的 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的正确方法吗? NSError *错误; if (![managedObjectContext save:&error]) { }
    • @JamesDunay 刚刚添加了 save 方法以及我将如何将其称为我的答案。希望对您有所帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    • 2015-04-24
    • 1970-01-01
    • 2019-04-08
    相关资源
    最近更新 更多