2014-06-27 43 views
0

所以,我試圖用核心數據保存「截圖」類的實例,其中包括:學習核心數據。實體,添加和加載

NSString *note; 
NSData *screenshot; 
NSData *thumbnailOfScreenshot; 
NSTimeInterval date; 

在我的核心數據文件,我有兩個實體,因爲我只在必要時纔會獲取較大的圖像,並且一次只能處理一個(它將在UITableView中使用)。

實體1被稱爲屏幕截圖,由上述4個屬性組成,而*屏幕截圖是瞬態的。這個實體與實體2(一個叫做索引的int)也有一對一的關係。

實體2只有1個屬性,它是大圖像的二進制數據字段。與實體1也是一對一的關係。

所以,我的第一個問題:這是遠程接近正確嗎?我有點不確定我是否需要實體1中的Transient屬性「屏幕截圖」。如果我需要爲實體2創建一個新的類,這似乎有些奇怪,因爲它只包含圖片。

現在,我只是試圖添加和加載實例到數據庫和從數據庫加載實例。 這裏是我(覺得)我的實例添加到數據庫,但我不知道它其實是把它在DB馬上?:

Screenshot *s = [NSEntityDescription insertNewObjectForEntityForName:@"Screenshot" inManagedObjectContext:context]; 

我在我頭上,所以任何幫助會不勝感激。我已閱讀過幾本指南,但沒有一本是針對類似於此的。

回答

0

瞬態屬性不會保存到核心數據(它們既不會被檢索也不會從保存存儲中保存)。它們通常用於根據存儲屬性計算某種屬性(例如,我使用它們來查詢基於人姓氏的第一個字母的查詢 - 我存儲完整的姓氏,但firstLetterOfLastName是一個瞬態屬性 - 但是由於Core Data知道它,我可以訂購結果)。

如果我正確理解你的模型,你可能根本不需要瞬態屬性。

我也不認爲你需要一個全新的模型爲你的「大型圖像」。通過打開「存儲在外部記錄文件中」,您可以指示Core Data優化其大型二進制屬性的後備存儲。您可以在設置了Transient和Optional的下方的Data Model Inspector窗格中找到它。這將保持實際的備份數據庫活躍,但允許Core Data檢索這些大的二進制屬性,並且您仍然可以使用Core Data NSManagedObject實例無縫地使用它們。

另外,一般情況下,不要將項目與某個其他存儲的核心數據對象的「索引」值相關聯。有足夠的理由這樣做,但總的來說,這是Core Data關係的目的。如果「電影」有多個「屏幕截圖」,例如,您可以在名爲「屏幕截圖」的Movie實例上建立關係,您只需將每個屏幕截圖添加到(它實際上是一個NSMutableSet即可)。

核心數據是一個對象圖,而不是關係數據庫。如果您將相同的對象實例添加到不同所有者對象實例上的兩個關係中,則不會複製該子對象 - Core Data會爲您完成所有與它們相關的工作(假設您的模型安裝得很好) 。

0

我會重新考慮這一點。我認爲一個實體就足夠了。我可以添加一個名爲'large'的BOOL值,並在「large = NO」時獲取小圖片。或者,如果您想要更多控制,請添加描述圖像大小的「像素」或「百萬像素」字段。然後你可以獲取'像素> 3000000'的地方。

如果兩個圖像之間有特殊關​​系(即一個圖像是另一個圖像的縮略圖),我只需將關係添加到另一個Screenshot實體。

或者,您也可以使一個實體成爲另一個實體的另一個實體(當您選擇實體時,請參閱數據模型檢查器)。

你在正確的軌道上。不斷思考你想如何使用你的實體。這應該有助於你更好地描述關係。我經常在編寫數據模型之前使用這些實體編寫代碼。這讓我最終得到更清晰的接口並減少實體之間的重疊。