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

Этот вопрос касается базовых данных.

Я создал объект с именем TV с тремя атрибутами: name , price и размер .Я также создал подкласс NSMutableObject с файлами TV.h и TV.m .

Я импортировал TV.h в свой DetailViewController.h , который обрабатывает мои ползунки и UIElements. Я хочу принять значения.

Итак, я сделал запрос на выборку, и все работает нормально, НО :

Каждый раз, когда я обновляю UISlider (valueDidChange :), Xcode создает COPY моего объекта и добавляет его в мой TV-Object .

All Iхочу, чтобы XCode просто редактировать и сохранять в текущем объекте , а не редактировать и сохранять в новом объекте .

Помощь очень ценится!

Заранее спасибо.

Мой код:

DetailViewController.m

- (IBAction)collectSliderValue:(UISlider *)sender {

if (__managedObjectContext == nil) {
    NSLog(@"Problem ...");
    __managedObjectContext = [(MasterViewController *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    NSLog(@"... solved!");
}

if (sender == sizeSlider) {

    NSError *error = nil;

    NSManagedObjectContext *context = [self managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TV" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];
    NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

    TV * currentTV = [[TV alloc] initWithEntity:entity insertIntoManagedObjectContext:context];

    currentTV.size = [[NSNumber alloc] initWithInt:(sender.value + 0.5f)];
    currentTV.name = @"New TV!";

    NSError *error11;
    [__managedObjectContext save:&error11];

    for (NSManagedObject *info in fetchedObjects)
    {
        NSLog(@"Name = %@", [info valueForKey:@"name"]);
        NSLog(@"Size = %@", [info valueForKey:@"size"]);
        NSLog(@"Price = %@", [info valueForKey:@"price"]);
    }
    [fetchRequest release];
}

1 Ответ

0 голосов
/ 07 ноября 2011
//Editing begins ...     
TV * currentTV = [[TV alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 

Редактирование не начинается, вы создаете новый объект прямо здесь. Вашему контроллеру представления нужна переменная экземпляра для хранения текущей сущности TV, которую вы изменяете.

В созданном вами шаблонном проекте переменная detailItem содержит управляемый объект, который вы в данный момент редактируете. Вы должны специально установить это как TV объект и ссылаться на него вместо currentTV в вашем коде detailViewController. Вы должны удалить все запросы на выборку и код контекста управляемого объекта - это не относится к вашему контроллеру подробного представления, им должен управлять главный контроллер представления.

Итак, в DetailViewController.h:

@property (strong, nonatomic) id detailItem;

становится

@property (strong, nonatomic) TV detailItem;

А в вашем методе collectSliderValue это должно выглядеть намного проще:

- (IBAction)collectSliderValue:(UISlider *)sender 
{

    if (sender == sizeSlider) 
        self.detailItem.size = [NSNumber numberWithFloat:sender.value];    
}

Сохранение контекста управляемого объекта не должно происходить до тех пор, пока вы не вернетесь в контроллер подробных представлений, об этом позаботится делегат приложения.

В файле .m вашего основного контроллера деталей вам также может понадобиться импортировать файл TV.h, чтобы он знал, что TV является подклассом NSManagedObject. Кроме того, приведение к телевизору при настройке элемента детализации:

self.detailViewController.detailItem = (TV*)selectedObject;
...