核心数据保存实体属性

时间:2011-11-07 16:15:47

标签: cocoa-touch core-data fetch

这个问题是关于核心数据的。

我创建了一个名为电视的实体,其中包含三个名为名称价格尺寸的属性。我还使用 TV.h TV.m 文件创建了NSMutableObject的子类。

我将 TV.h 导入我的 DetailViewController.h ,它处理我想要取值的滑块和UIElements。

所以我做了一个获取请求,一切正常,但是

每当我更新UISlider(valueDidChange :)时,Xcode会创建我的实体的 COPY ,并将其添加到我的电视对象

我只想要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 :(得分:0)

//Editing begins ...     
TV * currentTV = [[TV alloc] initWithEntity:entity insertIntoManagedObjectContext:context]; 

编辑没有开始,你正在那里创建一个新对象。您的视图控制器需要一个实例变量来保存您正在修改的当前TV实体。

从您创建的模板项目中,变量detailItem包含您当前正在编辑的托管对象。您应该将其专门设置为TV对象,并在您的detailViewController代码中引用它而不是currentTV。您必须删除所有获取请求和托管对象上下文代码 - 这与您的详细视图控制器无关,它应由主视图控制器管理。

所以,在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文件,以便它知道电视是NSManagedObject子类。此外,在设置详细信息时投射到电视:

self.detailViewController.detailItem = (TV*)selectedObject;
相关问题