Jam*_*nay 1 iphone xcode core-data objective-c
所以我对核心数据非常新,但是我经历了一个教程并且非常了解它,至少是大多数事情背后的想法.但我还有一个问题,我无法找到任何地方.看起来很简单,但现在就是这样.如果我在一个实体中有两个字符串,我们可以说:
1.name 
 
2.position
如果已输入名称,我如何允许用户在textField中输入文本并在以后将其分配到其位置?即使有20个名字,考虑没有重复?
我以为它可能是这样的......但它似乎没有用.
UserInfo *userInfo = (UserNumber *)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:managedObjectContext];
if ([userName isEqualToString:"@James"]) {
    userInfo.Position = nameField.text;
}
Run Code Online (Sandbox Code Playgroud)
    在上面的代码中,您将(UserNumber*)转换为您声明为(UserInfo*)的对象?这是什么,有什么理由你这样做?
如果我正确理解您的问题,您希望创建一个仅预先填充用户名的记录,然后允许在稍后阶段更新该记录.
我将假设你的实体被调用,UserInfo并且为它创建了2个NSString属性 - userName和position.我还假设您已经为UserInfo创建了类文件,并将标头导入相关的视图控制器.
这是你如何做到的:
1)首先,假设您输入了a中的用户名UITextField *userNameField,让我们创建一个新记录.
UserInfo *userInfo = (UserInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
[userInfo setValue:userNameField.text forKey:@"userName"];
Run Code Online (Sandbox Code Playgroud)
这将UserInfo在您的托管对象上下文中创建一个新实例,并将值设置userName为值onuserNameField.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];
Run Code Online (Sandbox Code Playgroud)
如果找到fetchRequest与你的userNameField.text参数匹配,它们将被保存在fetchRequestArray.如果您采取必要的步骤使userName属性成为必需且唯一的,那么应该最多只有一个对象.
通过抓取objectAtIndex:0数组并更改它的position属性来访问该对象:
UserInfo *userInfoToBeEdited = [fetchRequestArray objectAtIndex:0];
[userInfoToBeEdit setValue:positionTextField.text forKey:@"position"];
Run Code Online (Sandbox Code Playgroud)
在上述两种情况下,请记住在准备好提交更改时调用CoreData的save方法.在调用save之前,您的更改仅保留在托管对象上下文中,该上下文基本上是持久数据的暂存区.
[编辑添加保存方法]
根据你的评论,我通常在我的AppDelegate中有以下保存方法(直接从Apple模板复制/粘贴)
- (void)saveContext
{
    error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
        {
            [self seriousErrorAlert];
        } 
    }
}
Run Code Online (Sandbox Code Playgroud)
然后每当我需要保存更改时,从任何视图控制器我只需获取对我的AppDelegate的引用并将其关闭:
AppDelegate *theDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[theDelegate saveContext];
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           2151 次  |  
        
|   最近记录:  |