我有CoreData应用程序在外部文件中存储一些BLOB(“允许外部存储”标志)。使用QLPreviewController和核心数据的正确方法
文件是图像,PDF文件,excel文件等我想用QLPreviewController
ti预览它。但它从头开始不支持CoreData。所以,我应该先将文件复制到tmp文件夹中。我相信应该有更好的方法来做到这一点。 有没有?
我有CoreData应用程序在外部文件中存储一些BLOB(“允许外部存储”标志)。使用QLPreviewController和核心数据的正确方法
文件是图像,PDF文件,excel文件等我想用QLPreviewController
ti预览它。但它从头开始不支持CoreData。所以,我应该先将文件复制到tmp文件夹中。我相信应该有更好的方法来做到这一点。 有没有?
根据QLPreviewItem
的文档,previewItemURL
返回的URL必须是文件URL。
因此,您必须能够为其生活在磁盘上的文件提供一个URL。 Apple没有提供官方的方式来获取外部存储的数据的URL。此外,无论如何,“小”文件将作为BLOB存储在SQL数据库中。
两个最可行的方案,其一是将内容复制到一个临时文件在需要的时候,或在磁盘上存储自己的文件,并保持URL(或更好,但...唯一标识符)的核心数据模型。
我会用第二种方法。
如果将文件存储在包含核心数据存储的目录的子目录中,则可以在数据库中保留一个UUID。然后,即使您想将其移至其他位置,您也可以识别该文件,并且不必更改商店中的所有实体。
假设您在持久存储的同一目录中有一个名为“externalFiles”的目录。
如果你使用一个特殊的实体,您可以为特定的项目添加两个简单的属性(标识符和标题)。标识符可以是NSUUID
的字符串表示。
你可能已经想在网址...
- (NSURL*)URL {
// Separated on multiple lines for readability
NSString *identifier = [self valueForKey:@"identifier"];
NSURL *url = self.objectID.persistentStore.URL;
url = [url URLByDeletingLastPathComponent];
url = [url URLByAppendingPathComponent:@"externalFiles"];
url = [url URLByAppendingPathComponent:identifier];
return url;
}
然后,您可以让您的NSManagedObject
子通过实施这两种方法previewItemURL
和previewItemTitle
符合QLPreviewItem
协议。
- (NSURL*)previewItemURL {
return self.URL;
}
- (NSURL*)previewItemTitle {
return self.title;
}
然后,你可以通过你的核心数据实例的QLPreviewControllerDataSource
,因为他们现在可以为QLPreviewItem
s内处理。