如何在Core Data中存储图像?

时间:2010-06-06 17:46:08

标签: iphone core-data

只是一个猜测:我创建一个属性并使其类型为“二进制”。但最后,我将如何使用它?我猜幕后有一个NSData?那么该属性实际上是一个NSData?

3 个答案:

答案 0 :(得分:18)

这个问题已被多次询问,答案有点复杂。

当谈到二进制数据时,您应该根据您将要使用的数据的预期大小来确定如何存储它。规则是:

  • 小于100K;在主表中存储为二进制属性
  • 小于1M;存储为辅助表中的二进制属性以避免过度提取
  • 大于1M;存储在磁盘上并将其文件路径存储在Core Data表中。

此外,在存储图像时,建议以标准格式存储图像,例如JPG或PNG。通过使用transformable属性类型,当实际存储是PNG表示时,实际上您的子类可以提供访问UIImage类的外观。我在Cocoa Is My Girlfriend上的沼泽帖中详细介绍了这一点。

更新

存储>背后的原因磁盘上的1M二进制数据是由于缓存造成的。 NSPersistentStoreCoordinator将保留数据缓存,以便当您的应用程序请求“下一个”对象时,它不需要返回磁盘。此缓存可以很好地真正。但它在iOS上很小,非常小。如果你输入一大块二进制数据,很容易就会破坏整个缓存,整个应用程序都会受到很大的影响。

答案 1 :(得分:1)

这是正确的,使用二进制表示为NSdata对象,然后你可以使用uiimages imageWithData类方法来检索你的图像。

答案 2 :(得分:0)

马库斯的回答是有效的,但这不是简单的方法 - 而且,AFAICT,并不是苹果“打算”你这样做的方式。理论上,您应该能够将图像标记为“可转换”,而CD将自动完成所有操作。

这不起作用,因为UIImage“缺少”NSCoding的实现 - Apple的序列化系统 - 因此CD的默认转换器不知道如何保存图像。

替代方案,需要一些代码,但仍然比Marcus的方法更简单......据称你遇到了Apple的错误。自2008年以来,Apple的CoreData实施(据称)已被破坏 - 任何“二进制”类型的数据存储都会忽略自定义变换器。

回到“CD会自动完成所有操作,如果只设置了UIImage”...恕我直言,UIImage应该是可序列化的,即使“默认”序列化并非适用于所有情况。如果你解决了这个问题,那么看看...... CoreData开始使用零编码保存/编码UIImage实例。

这是使您的UIImage实例全部可序列化的代码。您所要做的就是导入此类别/将此类别复制粘贴到您想要“升级”的UIImage版本的类中。

@implementation UIImage (MyCategory)

- (void)encodeWithCoder:(NSCoder *)encoder
{
    [encoder encodeDataObject:UIImagePNGRepresentation(self)];
}

- (id)initWithCoder:(NSCoder *)decoder
{
    NSData *data = [[decoder decodeDataObject] retain];

    return [[UIImage alloc] initWithData:data];
}

@end