核心数据 - 存储图像(iPhone)[关闭]

Posted

技术标签:

【中文标题】核心数据 - 存储图像(iPhone)[关闭]【英文标题】:Core Data - Storing Images (iPhone) [closed] 【发布时间】:2010-01-18 23:41:47 【问题描述】:

我有一个应用程序,允许用户为其帐户添加图像。

我想知道如何使用 Core Data 存储图像(从相机或照片库获得),因为我可能会为用户提供备份工具并希望传输图像数据到服务器。

我遇到了创建Image 模型对象并与User 模型对象创建一对一关系的设计建议(这样除非需要,否则不会调用关联的 Image 对象)。但是,我不确定如何实际存储图像以及这在性能方面是否可能是致命的。

如果任何尝试过的人就方法和陷阱提供任何建议,我将不胜感激。

【问题讨论】:

【参考方案1】:

Core Data中存储图像数据的规则如下:

1 mb 存储在磁盘上并引用您的 Core Data 存储中的路径。

您可以使用可转换数据类型将 NSImage 直接存储到 Core Data 中。事实上,您可以使用可转换数据类型来存储任何实现 NSCoder 协议的内容。

我个人不会将其转换为 CGImageRef,因为这样会丢失很多信息。

【讨论】:

有一些令人兴奋的新方法可以让您摆脱 ios5 中的麻烦。检查文档,它仍在 NDA 之下。 @steipete 现在 iOS5 不在 NDA 之下,我假设您指的是新的“...用于属性值的外部存储。如果您指定可以存储托管对象属性的值作为外部记录,Core Data 会根据每个值启发式地决定是将数据直接保存在数据库中还是将 URI 存储到它为您管理的单独文件中。” 仅供参考,外部存储不适用于 iOS。这是一个仅限桌面的标志。 我一直在一个小应用程序上使用外部存储标志,它似乎工作正常,但我想,根据 Marcus 的说法,它没有做任何事情。我想这意味着我正在保存的照片只是在我的数据库中保存为大块。我希望苹果能告诉我! 它是文档中的一个小脚注,当我发现它时也让我震惊。【参考方案2】:

自从提出这个问题以来已经过去了一段时间,但我想分享我在这个问题上的经验。

如果图像数量不受限制,我不建议您将图像存储在数据库中。您应该记住,有一天您将添加新版本的数据模型,并且您必须在 App 更新时从旧数据库迁移到新数据库。这需要时间。数据库文件越大,迁移所需的时间就越长。

如果您想在 DB 中存储图像,请确保不要在 UIApplicationDelegateapplication: didFinishLaunchingWithOptions: 方法中添加持久存储。如果迁移未在 XX 秒内完成,iOS 将终止您的应用。

【讨论】:

非常感谢您 +1 的评论 :-) 您能否发布可靠的来源参考来引用您对“如果迁移无法在 30 秒内完成,iOS 将终止您的应用程序”的评论?【参考方案3】:

陷阱:您最终可能会得到庞大的、难以处理的 sqlite 数据库。您真的希望您的用户一步上传一个数 MB 的文件到服务器吗?如果手机连接中断几秒钟,你会怎么做?

我认为如果您使用 Core Data 来管理您的图像及其上传状态(上传:是或否)会更好。这样,您可以上传适合您的应用程序工作流程的图像。好的,它会持续更长时间,因为有很多连接。但我认为这是一种更清洁的方法...

当您想到 iTunes 时,当谈到备份时:您的本地 iPhone 的“文档”文件夹无论如何都会同步。

【讨论】:

感谢您的回答。我可能会简单地将路径存储为字符串,然后依靠 iTunes 提供图像文件的备份(同时将其他帐户相关数据存储在远程服务器上)。【参考方案4】:

你必须有一个 a a,然后你可以做这样的事情:

CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];

其中 managedObject 是您的核心数据图像对象,@"data" 是二进制属性的名称。您可能还需要保存图像格式以便以后反序列化图像。

另一种选择是将图像保存到磁盘并将路径存储在核心数据中。

【讨论】:

另外,完成后释放 imageData。 还可以使用可转换属性签出:developer.apple.com/mac/library/documentation/Cocoa/Conceptual/… 抱歉,我知道这似乎是一个基本问题,但您如何着手(以及意味着什么)保存图像格式?我以前没有遇到过这个想法。 我指的是存储图像是 jpg 或 png(或其他格式)的事实。当您从数据库中获取图像数据时,您将需要此信息,以便选择正确的数据提供者将其转换为 CGImageRef。 谢谢埃尔弗雷德。很有帮助的答案。

以上是关于核心数据 - 存储图像(iPhone)[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iphone 中的核心数据将图像存储到 sqlite? [复制]

如何将图像存储在 iPhone 的 sqlite 数据库中? [关闭]

iPhone核心数据预设

iPhone中的iCloud实现应用程序? [关闭]

Swift 3 中的 JSON 图像和核心数据 [关闭]

iCloud核心数据不传输图像