Ios 对核心数据使用QLEVIEWCONTROLLER的正确方法
我有一个CoreData应用程序,它在外部文件中存储一些blob(“允许外部存储”标志) 文件是图像、PDF、excel文件等。我想使用Ios 对核心数据使用QLEVIEWCONTROLLER的正确方法,ios,core-data,qlpreviewcontroller,Ios,Core Data,Qlpreviewcontroller,我有一个CoreData应用程序,它在外部文件中存储一些blob(“允许外部存储”标志) 文件是图像、PDF、excel文件等。我想使用qlviewControllerti预览它。但它不支持从头开始的CoreData。所以,我应该首先将文件复制到tmp文件夹。我相信应该有更好的方法来做到这一点。 是否有?根据QLPreviewItem的文档,previewItemURL返回的URL必须是文件URL 因此,您必须能够为它提供一个位于磁盘上的文件的URL。苹果没有提供一种官方方式来获取外部存储数据的
qlviewController
ti预览它。但它不支持从头开始的CoreData。所以,我应该首先将文件复制到tmp文件夹。我相信应该有更好的方法来做到这一点。
是否有?根据
QLPreviewItem
的文档,previewItemURL
返回的URL必须是文件URL
因此,您必须能够为它提供一个位于磁盘上的文件的URL。苹果没有提供一种官方方式来获取外部存储数据的URL。此外,“较小”的文件将作为BLOB存储在SQL数据库中
两个最可行的选择是在需要时将内容复制到临时文件中,或者自己将文件存储在磁盘上,并在核心数据模型中保留URL(或者更好的是…唯一标识符)
我会选择第二种方法
如果将文件存储在包含核心数据存储的目录的子目录中,则可以在数据库中保留UUID。然后,您可以识别该文件,即使您想将其移动到其他位置,也不必更改存储中的所有实体
假设您有一个名为“externalFiles”的目录,它与持久存储在同一个目录中
如果使用特殊实体,则可以为特定项添加两个简单属性(标识符和标题)。标识符可以是nsuid
的字符串表示形式
您可能已经想获取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;
}
然后,通过实现两种方法previewItemURL
和previewItemTitle
,可以使您的NSManagedObject
子类符合QLPreviewItem
协议
- (NSURL*)previewItemURL {
return self.URL;
}
- (NSURL*)previewItemTitle {
return self.title;
}
然后,您可以将核心数据实例传递给qlviewcontrollerdatasource
,因为它们现在可以被视为qlviewItem
s