В приведенном выше коде вы приводите (UserNumber *) к объекту, который вы объявляете как (UserInfo *)? Что есть что и есть ли причина, почему вы это делаете?
Если я правильно понимаю ваш вопрос, вы хотите создать запись только с предварительно заполненным именем пользователя, а затем разрешить обновление этой записи на более позднем этапе.
Я предполагаю, что ваша сущность называется UserInfo
и для нее создано 2 свойства NSString - userName
и position
. Я также предполагаю, что вы создали файлы классов для UserInfo и импортировали заголовок в соответствующие контроллеры представления.
Вот как бы вы это сделали:
1) Во-первых, если вы ввели имя пользователя в UITextField *userNameField
, давайте создадим новую запись.
UserInfo *userInfo = (UserInfo*)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:self.managedObjectContext];
[userInfo setValue:userNameField.text forKey:@"userName"];
Это создаст новый экземпляр UserInfo
в контексте управляемого объекта и установит значение userName
равным userNameField.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];
Если fetchRequest найдет совпадение с вашим параметром userNameField.text
, они будут сохранены в fetchRequestArray
. Там должно быть не более одного объекта, если вы предпримете необходимые шаги, чтобы сделать свойство userName
обязательным И уникальным.
Чтобы получить доступ к объекту, выберите objectAtIndex:0
в массиве и измените его свойство position
:
UserInfo *userInfoToBeEdited = [fetchRequestArray objectAtIndex:0];
[userInfoToBeEdit setValue:positionTextField.text forKey:@"position"];
В обоих вышеописанных случаях не забывайте вызывать метод сохранения CoreData, когда вы будете готовы зафиксировать свои изменения. Перед вызовом сохранения ваши изменения хранятся только в контексте управляемого объекта, который в основном является блокнотом для ваших постоянных данных.
[ПРАВИТЬ, ЧТОБЫ ДОБАВИТЬ СОХРАНИТЬ МЕТОД]
Согласно вашему комментарию, у меня обычно есть метод сохранения ниже в моем AppDelegate (копирование / вставка непосредственно из шаблона Apple)
- (void)saveContext
{
error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
{
[self seriousErrorAlert];
}
}
}
А потом, когда мне нужно сохранить изменения, с любого контроллера представления я просто беру ссылку на мой AppDelegate и запускаю его:
AppDelegate *theDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
[theDelegate saveContext];