Iphone 我应该如何在核心数据数据库中存储UIImage?

Iphone 我应该如何在核心数据数据库中存储UIImage?,iphone,objective-c,core-data,ios,Iphone,Objective C,Core Data,Ios,我正在开发一个应用程序,它需要大约100个图像或更多图像与其他相关信息一起预插入到核心数据数据库中 现在,我只需编写几行代码就可以轻松地添加其他数据,但对于UIImages,我不确定如何在不编写大量代码的情况下添加数据。我在想:到底有没有什么方法可以轻松做到这一点,或者如果没有什么方法可以用最少的努力实现这一点 另外,将图像存储在核心数据数据库中可以吗?还是只将图像的地址保存在本地文件系统上?将图像存储在核心数据数据库中非常容易。您只需要将图像属性标记为可转换属性,并创建NSValueTrans

我正在开发一个应用程序,它需要大约100个图像或更多图像与其他相关信息一起预插入到核心数据数据库中

现在,我只需编写几行代码就可以轻松地添加其他数据,但对于UIImages,我不确定如何在不编写大量代码的情况下添加数据。我在想:到底有没有什么方法可以轻松做到这一点,或者如果没有什么方法可以用最少的努力实现这一点


另外,将图像存储在核心数据数据库中可以吗?还是只将图像的地址保存在本地文件系统上?

将图像存储在核心数据数据库中非常容易。您只需要将图像属性标记为可转换属性,并创建NSValueTransformer的子类。在该子类中,添加如下代码:

+ (Class)transformedValueClass 
{
    return [NSData class]; 
}

+ (BOOL)allowsReverseTransformation 
{
    return YES; 
}

- (id)transformedValue:(id)value 
{
    if (value == nil)
        return nil;

    // I pass in raw data when generating the image, save that directly to the database
    if ([value isKindOfClass:[NSData class]])
        return value;

    return UIImagePNGRepresentation((UIImage *)value);
}

- (id)reverseTransformedValue:(id)value
{
    return [UIImage imageWithData:(NSData *)value];
}
对于可转换属性,指定该子类的名称作为值转换器名称

然后,您可以为承载此图像属性的实体创建NSManagedObject子类,并声明此图像属性的属性:

@property(nonatomic, retain) UIImage *thumbnailImage;
您可以从该属性读取UIImages,也可以将UIImages写入该属性,并且这些UIImages将在NSData之间进行透明更改,以存储在数据库中


是否这样做取决于你的具体情况。较大的图像可能不应该以这种方式存储,或者至少应该存储在它们自己的实体中,以便在遵循与它们的关系之前不会将它们提取到内存中。用这种方式将小缩略图图像放入数据库可能很好。

苹果确实提供了一些关于斑点的建议:

如果应用程序使用大blob (“二进制大对象”如图像 和声音数据),你需要小心 尽量减少日常开支。确切的 “小”、“适度”和“适度”的定义 “大”是流动的,取决于 应用程序的用法。松散的规则 拇指是指物体按 千字节的大小是“适中的” 大小和顺序为 兆字节的大小是“大”的。 一些开发者已经取得了不错的成绩 在一个系统中使用10MB Blob的性能 数据库另一方面,如果 一个应用程序中有数百万行 表中,即使是128字节也可能是一个 “中等”大小的CLOB(字符大 对象),需要进行规范化 放在一张单独的桌子上

通常,如果您需要存储水滴 在持久存储中,您应该使用 SQLite商店。XML与二进制 存储要求整个对象 图形驻留在内存中,并存储 写入是原子的(请参阅“持久性” 存储功能”),这意味着 不能有效地处理大型问题 数据对象。SQLite可以扩展到 处理非常大的数据库。 如果使用得当,SQLite提供了良好的性能 高达100GB的数据库的性能, 一行最多可容纳1GB的数据 (当然,阅读1GB的 将数据存入内存是一项昂贵的任务 无论运营效率如何 存储库)

BLOB通常表示一个属性 指实体,例如照片 可能是员工的属性 实体。适用于小型至中型 BLOB(和CLOB),您应该创建一个 数据和数据的单独实体 在适当位置创建一对一关系 属性的属性。比如你 可能会创造员工和照片 具有一对一关系的实体 他们之间的关系,在哪里 雇员与雇员之间的关系 照片代替了员工的照片 照片属性。这种模式 最大化对象的好处 断层作用(参见“断层作用和 唯一性”)。任何给定的照片都是 仅当它实际上是 需要(如果关系是 横穿)

不过,如果你有能力,那就更好了 将blob存储为服务器上的资源 文件系统,并维护链接 (例如URL或路径)到那些 资源。然后可以将BLOB作为 必要时


如上所述的图像转换器的一个很好的例子是iPhoneCoreDataRecipes演示应用程序。

现在,任何人都可以查看以下内容:UIImage现在符合iOS 5中的NSCoding。如果您能够以iOS5及更高版本为目标,则只需设置属性和Transformable即可。您还可以选中“允许外部存储”,使较大的图像自动保存在核心数据存储之外。由CoreData自动生成的代码的属性为id,而不是UIImiage*。这正常吗?我们应该改变吗?@JimThio-对,这是默认值。因为我知道我将为这个转换的属性设置UIImage,所以我将类型更改为UIImage。这有助于保持代码清晰,并在尝试以错误方式使用此属性时提供健全性检查。默认值为id,我手动将其更改为UIImage。这就是它的意图吗?根据阿提库斯的说法,我发现UIImage不再符合NSCoding,而是符合NSSecureCoding。在未设置NSValueTransformer的情况下使用Transformable将导致图像读取错误@然而,布拉德拉森的解决方案仍然有效。i、 你必须设置NSValueTransformer。太好了!谢谢你的提醒!以下是该示例的当前链接: