2014-11-15 76 views
0

我对使用核心数据保存实体有点困惑。我正在制作一个屏幕,允许用户保存他们的设置(联系信息),如果他们愿意,可以稍后再进行更改。将核心数据保存到只有一个实体

从我所了解的情况来看,下面的代码会在每次按下“保存”按钮时保存多个实体。

- (IBAction)saveSettings:(id)sender { 

    AppDelegate *appDelegate = 
    [[UIApplication sharedApplication] delegate]; 

    NSManagedObjectContext *context = 
    [appDelegate managedObjectContext]; 
    NSManagedObject *userSettings; 


    userSettings = [NSEntityDescription 
        insertNewObjectForEntityForName:@"UserSettings" 
        inManagedObjectContext:context]; 
    [userSettings setValue: _firstName.text forKey:@"firstName"]; 
    [userSettings setValue: _lastName.text forKey:@"lastName"]; 
    [userSettings setValue: _userEmail.text forKey:@"userEmail"]; 
    [userSettings setValue: _zipCode.text forKey:@"zipCode"]; 
} 

什么我不知道如何做的是保存一个实体,然后更改以后每当新值用户在相应的文本字段并按下“保存”属性的值。

回答

1

是 - 因为你用insertNewObjectForEntityForName:,新UserSettings每次运行方法时,对象被创建。你可能想要做的是从数据库中获取现有的设置,用这些数据更新你的textFields,呈现视图并让用户根据需要修改细节,然后(当他们按下保存按钮时)保存该数据回到数据库。

我想补充userSettings作为一个属性:

@property (strong, nonatomic) NSManagedObject *userSettings; 

,并在你的方法删除userSettings你在哪里使用insertNewObjectForEntityForName的声明,而行。

然后创建以处理从数据库中获取数据,并将其分配给您的文本框的新方法,具体如下:

-(void)loadSettings { 

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *context = [appDelegate managedObjectContext]; 

    NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"UserSettings"]; 
    NSError *error; 
    NSArray *results = [context executeFetchRequest:fetch error:&error]; 
    if (results == nil) { 
     // some error handler here 
    } 
    if ([results count] > 0) { 
     userSettings = [results lastObject]; 
     _firstName.text = [userSettings valueForKey:@"firstName"]; 
     _lastName.text = [userSettings valueForKey:@"lastName"]; 
     _userEmail.text = [userSettings valueForKey:@"userEmail"]; 
     _zipCode.text = [userSettings valueForKey:@"zipCode"]; 
    } else { 
     // set your text fields to some defaults values?? 
    } 
} 

调用此方法时,您的视图控制器负载,在viewDidLoad方法。我假定你通常只有一个UserSettings对象(因此lastObject将是唯一的对象!)。如果您可以有许多UserSettings对象,则需要过滤提取以获取所需的对象。要做到这一点,您需要设置一个predicate用于获取 - 请查看NSPredicate的文档。

+0

谢谢你的回答,这很有道理! 我几乎完成了这些更改,但有几个问题;你可以聊聊天吗? – narner

+0

当然 - 你能建立一个会议吗? – pbasdf

+0

是!以下是链接: http://chat.stackoverflow.com/rooms/65007/core-data-saving-to-only-one-entity – narner

0

实际上,每次“设置”时都会覆盖这些属性。存储个别属性的正确方法是给它们分配和保存,就像这样:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

NSManagedObjectContext *context = [appDelegate managedObjectContext]; 
NSManagedObject *userSettings; 


userSettings = [NSEntityDescription insertNewObjectForEntityForName:@"UserSettings" 
       inManagedObjectContext:context]; 


userSettings.firstName = _firstName.text; 
userSettings.lastName = _lastName.text; 
userSettings.userEmail = _userEmail.text; 
userSettings.zipCode = _zipCode.text; 


NSError *error = nil; 
if (![context save:&error]) { 

    NSLog(@"Error Saving: %@", error); 
} 
+0

嘿马科斯,谢谢你的回复。我看到了差异,但我不确定我是否明白为什么需要分配和保存,而不是设置属性。 – narner