2012-07-19 194 views
10

我需要獲取我創建的NSManagedObject類型的唯一標識符。只要對象已經創建,它就需要可用,永不改變,並且是完全獨特的。NSManagedObject的唯一標識符

這排除了NSManagedObjectID,因爲這可以在上下文保存時更改。如果我的對象具有相同的屬性,我相信-hash方法可能是非唯一的。

我真的想避免在實體上創建一個無用的uniqueIdentifier UUID字段,因爲這看起來很浪費和混亂。這裏有一個公認的最佳實踐嗎?

+0

你有沒有考慮過鹽漬哈希? – Jim 2012-07-19 05:06:03

+2

'NSManagedObjectID'將在上下文保存後進行更改,然後該對象將獲得最終的'NSManagedObjectID',並且它將不會被更改。你不應該擔心存在的ID,甚至沒有刪除'object',因爲沒有新的'object'會得到舊的ID。 – holex 2012-07-19 15:59:47

回答

15

嘗試NSManagedObjectIDURIRepresentation財產。這是目前NSManagerObject非常獨特的ID,但要小心直到NSManagedObject沒有保存它給你一個臨時ID只有,而不是一個永久的ID,他們可能會不同。 (我只是說,因爲我不知道你要使用的唯一的ID是什麼以及如何做。)

更新#1

一個假想的唯一ID只是,這是每個人的唯一URL NSManagedObject(如每個文件都有一個唯一的URL),使用它們,你可以找到原來的NSManagedObject,你失去了他們的指針後。我知道這很難理解,但這是NSManagedObjectID及其屬性的要點。

(如果你不明白的CoreData及其對象是如何工作的,你就不會downvote的答案。請閱讀更多的文檔,而不是毫無意義downvoting。)

更新#2

根據@NickLocking評論,我想延長我的回答上面的加粗部分:

直到保存NSManagedObjectContext爲新的和尚未保存的NSManagedObject類只有一個臨時的唯一ID。他們在第一次保存後會得到永久性的唯一ID。

+1

首次保存對象時,URIR表示發生更改。 – 2012-07-20 03:51:58

0

CoreData自動提供的惟一唯一標識符是對象ID,但正如您所注意到的,它在最初創建後會發生更改。但是你去想出另一種方式來解決此之前,你可能要考慮像定義在管理對象類以下的東西:

- (NSManagedObjectID *)permID { 
    if ([[self objectID] isTemporaryID]) { 
     // Save myself, returning nil if there are errors 
    } 
    return [self objectID]; 
} 

這種做法是不以任何方式完美的,特別是如果你需要在對象處於有效狀態並且可以保存到數據庫之前公開永久ID。但是,只要您不需要保存對象,就可以以一致的方式公開永久ID。

+1

這樣做的麻煩是,在此實例中保存對象意味着我的應用程序的其他部分檢測到已創建一個新對象並對其進行處理。這意味着,例如,一個tableview條目是在沒有設置字段的情況下創建的。 – 2012-07-20 03:52:52

3

最終我已經決定沒有好的方法來做到這一點,所以我創建了一個uniqueIdentifier字段,將UUID應用於awakeFromInsert。

保存對象會導致我的應用程序的其他部分,特別是NSFetchedResultsControllers在我完成對象之前更新。我簡單地嘗試了NSManagedObjectContext的obtainPermanentObjectIds:withError:方法,認爲它會在不保存上下文的情況下獲取對象ID,但實際上它只是保存上下文。