我有CoreData应用程序,它将一些BLOB存储在外部文件中(“允许外部存储”标记)。
文件是图像,PDF,excel文件等。我想用QLPreviewController
ti预览它。但它从头开始不支持CoreData。所以,我应该先将文件复制到tmp文件夹。我相信应该有更好的方法来做到这一点。
有没有?
答案 0 :(得分:1)
根据QLPreviewItem
的文档,previewItemURL
返回的网址必须是文件网址。
因此,您必须能够为磁盘上的文件提供URL。 Apple没有提供获取外部数据URL的官方方法。此外,"更小"无论如何,文件将作为BLOB存储在SQL数据库中。
两个最可行的选项是在需要时将内容复制到临时文件中,或者自己将文件存储在磁盘上,并在核心数据模型中保留URL(或更好的......唯一标识符)。
我选择第二种方法。
如果将文件存储在包含核心数据存储的目录的子目录中,则只需在数据库中保留UUID即可。然后,即使您要将文件移动到其他位置,也可以识别该文件,并且您不必更改商店中的所有实体。
假设您有一个名为" externalFiles"的目录。与持久存储在同一目录中。
如果您使用了特殊实体,则可以为特定项添加两个简单属性(标识符和标题)。标识符可以是NSUUID
的字符串表示形式。
您可能已经想要获取URL ...
- (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
和QLPreviewItem
来使previewItemURL
子类符合previewItemTitle
协议。
- (NSURL*)previewItemURL {
return self.URL;
}
- (NSURL*)previewItemTitle {
return self.title;
}
然后,您可以将核心数据实例传递给QLPreviewControllerDataSource
,因为现在可以将它们视为QLPreviewItem
。