我对使用 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"];
}
我不明白该怎么做是保存一个实体,然后每当用户在适当的文本字段中键入新值并按下“保存”时更改属性的值。
最佳答案
是的 - 因为您使用 insertNewObjectForEntityForName:
,每次运行该方法时都会创建一个新的 UserSettings 对象。您可能想要做的是从数据库中获取现有设置,用该数据更新您的文本字段,呈现 View 并让用户根据需要修改详细信息,然后(当他们按下保存按钮时)保存该数据返回数据库。
我会将 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??
}
}
当您的 View Controller 加载时,在 viewDidLoad
方法中调用此方法。我假设您通常只有一个 UserSettings
对象(因此 lastObject
将是唯一的对象!)。如果您有许多 UserSettings 对象,则需要过滤提取以仅获取您想要的对象。为此,您需要为获取设置一个 predicate
- 查看 NSPredicate
的文档。
关于ios - 核心数据仅保存到一个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26947818/