2009-10-22 165 views
4

我有一個數據模型包含幾個實體,每個實體都有幾個不同的存儲圖像數據的屬性。這些都將是小圖像,我需要將它們存儲在持久性存儲中,而不是作爲外部文件。在覈心數據數據模型中有效地存儲相同的數據

儘管我可以將圖像數據存儲在Binary或Transformable屬性中,但很可能用戶將爲這些屬性中的兩個或多個指定相同的圖像,所以我寧願存儲每個唯一圖像的一個副本比複製圖像數據。

我已經搞砸了創建一個「ImageBlob」實體來存儲圖像數據和使用關係來做到這一點,但我是一個新手與核心數據,它是不是立即明白,如果這是正確的方法走。特別是,我該如何處理以下情況?

  • 我想我所有的圖像的多個實體的屬性使用相同的「圖像數據存儲」,讓各只有一個圖像斑點的實例存儲
  • 我需要確保,如果沒有對象使用的是圖像在數據存儲中,它被刪除

處理此問題的最佳方法是什麼?

回答

2

我的第一個問題是如何計劃確定兩個物體何時使用相同的圖像?您可以存儲和查詢圖像上的屬性,以確定您設置的圖像是否已經存在?從計算上來說,這有多昂貴?如果花費很多時間,則可能會優化存儲並影響性能。但是,如果您確實有辦法有效地完成此操作,則可以創建一個ImageBlob實體來執行您所描述的操作。使用ImageBlob的實體應與ImageBlobimageBlobimageBlobs關係。 ImageBlob應該與名稱相反,例如users

在你的代碼,當你想重用ImageBlob,這是因爲做這樣的事情非常簡單:

NSManagedObject *blob = // get the image blob 
NSManagedObject *user = // get the user 
[user setValue:blob forKey:@"imageBlob"]; // do this if it uses a single image 
[[user mutableSetValueForKey:@"imageBlobs"] addObject:blob]; // do this if it uses multiple images 

你要考慮的另一個考慮是如何處理那些沒有斑點做需要更長時間據推測,你想刪除任何未使用的圖像。爲此,您可以爲NSManagedObjectContextObjectsDidChangeNotification通知註冊您的應用程序委託或NSPersistentDocument子類(具體取決於您的應用程序是否基於文檔)。每當管理對象環境的變化,你可以刪除任何不需要的圖像是這樣的:

- (void)managedObjectContextObjectsDidSave:(NSNotification *)notification { 
    NSManagedObjectContext *managedObjectContext = [notification object]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:[NSEntity entityWithName:@"ImageBlob" inManagedObjectContext:managedObjectContext]]; 
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"[email protected] == 0"]; 
    NSArray *unusedBlobs = [managedObjectContext executeFetchRequest:fetchRequest error:nil]; // Don't be stupid like me; catch and handle the error 
    [fetchRequest release]; 

    for (NSManagedObject *blob in unusedBlobs) { 
     [managedObjectContext deleteObject:blob]; 
    } 
} 
+0

謝謝,這是一個有用的建議。這不是一個完整的解決方案,但我接受了答案。 – 2009-10-28 01:08:53

1

你可以一個名爲MD5獨特的屬性添加到Image實體,以確保你只存儲相同的圖像一次。

至於核心數據的東西,我認爲這樣的事情可能會起作用: 然後,做一個抽象的父實體(Parent)。添加從ParentImage的關係,稱爲image,併爲刪除方法設置「級聯」,以便刪除Parent時,Image也被刪除。將ImageParent之間的關係稱爲parent或其他內容,併爲刪除方法設置「Nullify」,以便在刪除Image時,Parent的圖像設置爲nil。然後,添加您的其他實體並將其父項設置爲Parent

相關問題