我正在开发一个应用程序,需要将大约100张图像或更多图像与其他相关信息一起预先插入到Core Data数据库中。
现在我可以通过编写几行代码轻松添加其他数据但是对于UIImages,我不确定如何在不编写大量代码的情况下执行此操作。我想知道:无论如何都可以轻松地做到这一点,或者如果没有最好的方法来实现这一点,那么最少的努力。
另外,将图像存储在Core Data数据库中是否可以,或者我们是否只在本地文件系统中保存图像的地址?
答案 0 :(得分:55)
将图像存储在Core Data数据库中非常容易。您只需将图像属性标记为可转换图像属性并创建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];
}
对于transformable属性,请将此子类的名称指定为Value Transformer Name。
然后,您可以为托管此图像属性的实体创建NSManagedObject子类,并声明此图像属性的属性:
@property(nonatomic, retain) UIImage *thumbnailImage;
您可以从UIImages读取UIImages并将UIImages写入此属性,它们将透明地更改为NSData以及从NSData更改以存储在数据库中。
是否这样做取决于您的具体情况。较大的图像可能不应该以这种方式存储,或者至少应该存在于它们自己的实体中,以便在跟随它们之间的关系之前不将它们提取到存储器中。小缩略图可能会以这种方式放入您的数据库。
答案 1 :(得分:11)
如上所述的图像转换器的一个很好的例子是在iPhoneCoreDataRecipes演示应用程序中。
答案 2 :(得分:8)
Apple确实提供了一些关于BLOB的建议: Large Data Objects (BLOBs)
如果您的应用程序使用大型BLOB (“二进制大对象”,如图像 和声音数据),你需要小心 最小化开销。最正确 定义“小”,“适度”,和 “大”是流动的,取决于一个 应用程序的用法。宽松的统治 拇指是按顺序排列的对象 千字节大小是“适度的” 大小和那些大小 兆字节大小是“大”的。 一些开发商已经取得了很好 一个10MB BLOB的性能 数据库。另一方面,如果一个 应用程序有数百万行 表,甚至128个字节可能是一个 “适度”大小的CLOB(字符大 (需要进行规范化) 进入一个单独的表。
通常,如果您需要存储BLOB 在持久性商店中,你应该使用 一个SQLite商店。 XML和二进制文件 商店要求整个对象 图存在内存中,并存储 写是原子的(参见“持久性 商店特色“)意味着他们 不要有效地处理大事 数据对象。 SQLite可以扩展到 处理极大的数据库。 正确使用,SQLite提供了很好的 数据库性能高达100GB, 并且单行最多可容纳1GB (虽然当然读取1GB的 数据到内存是一个昂贵的 操作无论效率如何 库)。
BLOB通常代表一个属性 实体 - 例如,照片 可能是员工的一个属性 实体。适用于小到适中的尺寸 BLOB(和CLOB),你应该创建一个 数据的独立实体和 建立一个一对一的关系 属性。例如,你 可能会创建员工和照片 具有一对一的实体 他们之间的关系,在哪里 从员工到员工的关系 照片取代了员工 照片属性。这种模式 最大化对象的好处 错误的(参见“错误与错误”) Uniquing”)。任何给定的照片是 仅在实际检索时才检索 需要(如果关系是 遍历)。
但是,如果你能够,那就更好了 将BLOB存储为资源 文件系统,并维护链接 (例如URL或路径) 资源。然后,您可以加载BLOB作为 并在必要时。