Основные атрибуты редактирования данных - PullRequest
1 голос
/ 19 февраля 2011

Так что я действительно новичок в основных данных, но я прошел учебное пособие и довольно хорошо его понял, по крайней мере, идею, лежащую в основе большинства вещей. Но у меня все еще есть 1 вопрос, который я нигде не могу найти. Это кажется действительно простым, но вот оно. Если бы у меня было две строки внутри одной сущности, скажем:

1.name
2.position

Если имя уже введено, как я могу позволить пользователю вводить текст в текстовое поле и назначать его своей позиции в более позднее время? Даже если было 20 имен, не считая дубликатов?

Я думал, что это может быть что-то вроде этого ... Но, похоже, это не работает.

UserInfo *userInfo = (UserNumber *)[NSEntityDescription insertNewObjectForEntityForName:@"UserInfo" inManagedObjectContext:managedObjectContext];

if ([userName isEqualToString:"@James"]) {
    userInfo.Position = nameField.text;
}

1 Ответ

7 голосов
/ 20 февраля 2011

В приведенном выше коде вы приводите (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...