Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 对核心数据使用QLEVIEWCONTROLLER的正确方法_Ios_Core Data_Qlpreviewcontroller - Fatal编程技术网

Ios 对核心数据使用QLEVIEWCONTROLLER的正确方法

Ios 对核心数据使用QLEVIEWCONTROLLER的正确方法,ios,core-data,qlpreviewcontroller,Ios,Core Data,Qlpreviewcontroller,我有一个CoreData应用程序,它在外部文件中存储一些blob(“允许外部存储”标志) 文件是图像、PDF、excel文件等。我想使用qlviewControllerti预览它。但它不支持从头开始的CoreData。所以,我应该首先将文件复制到tmp文件夹。我相信应该有更好的方法来做到这一点。 是否有?根据QLPreviewItem的文档,previewItemURL返回的URL必须是文件URL 因此,您必须能够为它提供一个位于磁盘上的文件的URL。苹果没有提供一种官方方式来获取外部存储数据的

我有一个CoreData应用程序,它在外部文件中存储一些blob(“允许外部存储”标志)

文件是图像、PDF、excel文件等。我想使用
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