2015-11-08 42 views
0

我有CoreData应用程序在外部文件中存储一些BLOB(“允许外部存储”标志)。使用QLPreviewController和核心数据的正确方法

文件是图像,PDF文件,excel文件等我想用QLPreviewController ti预览它。但它从头开始不支持CoreData。所以,我应该先将文件复制到tmp文件夹中。我相信应该有更好的方法来做到这一点。 有没有?

回答

1

根据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子通过实施这两种方法previewItemURLpreviewItemTitle符合QLPreviewItem协议。

- (NSURL*)previewItemURL { 
    return self.URL; 
} 

- (NSURL*)previewItemTitle { 
    return self.title; 
} 

然后,你可以通过你的核心数据实例的QLPreviewControllerDataSource,因为他们现在可以为QLPreviewItem s内处理。

相关问题