我有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內處理。