2015-11-08 41 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內處理。

相關問題