核心数据仅保存到一个实体

时间:2014-11-15 16:10:40

标签: ios objective-c core-data

我对使用Core Data保存实体感到有点困惑。我正在制作一个屏幕,允许用户保存他们的设置(联系信息),如果他们愿意,可以在以后更改。

根据我的理解,每次按下“保存”按钮时,下面的代码将保存多个实体。

- (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"];
}

我不明白该怎么做是保存一个实体,然后在用户在相应的文本字段中输入新值并按“保存”时更改属性的值。

2 个答案:

答案 0 :(得分:1)

是 - 因为您使用insertNewObjectForEntityForName:,每次运行该方法时都会创建一个新的UserSettings对象。您可能想要做的是从数据库中获取现有设置,使用该数据更新textFields,显示视图并让用户根据需要修改详细信息,然后(当他们按下保存按钮时),保存该数据回到数据库。

我会将userSettings添加为属性:

    @property (strong, nonatomic) NSManagedObject *userSettings;

并在您的方法中删除userSettings的声明以及您使用insertNewObjectForEntityForName的行。

然后创建一个新方法来处理从数据库中提取数据并将其分配给textFields,如下所示:

-(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的文档。

答案 1 :(得分: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);
}