我对使用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"];
}
我不明白该怎么做是保存一个实体,然后在用户在相应的文本字段中输入新值并按“保存”时更改属性的值。
答案 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);
}