在核心数据实体中删除二进制属性的数据(在 NSImageView 中使用)

Posted

技术标签:

【中文标题】在核心数据实体中删除二进制属性的数据(在 NSImageView 中使用)【英文标题】:Removing a binary attribute's data(used in NSImageView) in Core Data entity 【发布时间】:2009-06-23 23:46:42 【问题描述】:

我有一个可选的二进制属性:image,其中包含我的实体的图像。 在界面中,我有 NSImageView(Image Well),还有一个“Remove Image”按钮。单击图像删除按钮时,我会这样做:

- (IBAction)saveAction:(id)sender 
  NSError *error = nil;
  if (![[self managedObjectContext] save:&error]) 
    [[NSApplication sharedApplication] presentError:error];
  
  [tableView reloadData];


- (IBAction)removeImage:(id)sender 
  [image setImage:nil]; // image is a NSImageView outlet bound to the image attribute.
  [self saveAction:sender];

它从 NSImageView 中清除图像,但二进制数据仍保留在 Core Data 实体中。

我如何也反映 Core Data 实体的变化?

谢谢!

编辑:

NSImageView 已经绑定到模型的图像属性,也可以作为出口使用。所以我只是想找人告诉我如何通过获取模型来重置属性(如果这是我需要做的)。

感谢任何代码帮助。 :)

【问题讨论】:

【参考方案1】:
[image setImage:nil];

image 实际上是一个图像视图吗?如果是这样,我必须提醒您清楚准确地命名您的实例变量。

您需要设置模型对象的image 属性,而不是视图。通过控制器将视图绑定到模型;然后,当您更改模型时,视图会免费获取更改。

【讨论】:

是的,image 是一个 NSImageView 出口。我在这里为上下文更改了它的名称。您说过,“通过控制器将视图绑定到模型”。你能给我推荐一些我需要为此使用的代码吗?我对以编程方式处理核心数据相当陌生。感谢您的帮助! 您通常在 IB 中设置绑定。以编程方式执行此操作的唯一原因是您已经制作了一个或多个自定义视图类,并且不想为它们制作 IB 插件。有关更多信息,请参阅 Cocoa 绑定编程主题:developer.apple.com/documentation/Cocoa/Conceptual/… 我不知道以编程方式或通过 Interface Builder 的绑定在这里有何不同。我感谢您的帮助。如果我能得到一些直接的代码来帮助我更快地完成这项工作,我也将不胜感激。 它没有。唯一的区别是通过 IB 绑定通常更容易。结果都是一样的。 是的,如何重置模型实体的图像? (而不是 NSImageView,我相信,当一个新实体尚未保存时,我还需要它;但暂时不要这样做。)【参考方案2】:

我的印象是,从 fetch 请求中更改数组不会对存储中的实际数据产生影响。但是我错了。我试过了,它奏效了!感谢彼得和其他地方的所有人!

以下是我为当前选择的具有唯一属性的实体替换图像删除功能:

- (IBAction)removeImage:(id)sender 
  // Fetch the entity in question.
  NSManagedObjectContext *context = [self managedObjectContext];
  NSManagedObjectModel *model = [self managedObjectModel];
  NSEntityDescription *entity = [[model entitiesByName] valueForKey:@"myEntity"];
  NSPredicate *predicate = [NSPredicate predicateWithFormat:
                            @"unique_attr == %@", [unique_attr_outlet stringValue]];
  NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
  [fetch setEntity:entity];
  [fetch setPredicate:predicate];

  // Load it into NSArray object and remove the binary data attribute.
  NSArray *contextArray = [context executeFetchRequest:fetch error:nil];
  if ([contextArray count] > 0)
    [[contextArray objectAtIndex:0] setValue:nil forKey:@"myImage"];

  [fetch release];

【讨论】:

以上是关于在核心数据实体中删除二进制属性的数据(在 NSImageView 中使用)的主要内容,如果未能解决你的问题,请参考以下文章

从核心数据中删除实体

核心数据迁移删除实体数据

如何从 Swift 的核心数据中删除特定的实体数据?

核心数据实体属性和关系,我想我很困惑

通过核心数据关系改变属性值

核心数据访问器 - 删除前