2012-11-26 97 views
0

我將數據從網上下了一個managedObject,然後再將這個新對象添加到managedObjectContext中,我想檢查它是否已經在數據庫中準備好了。有沒有辦法在一次打擊中比較兩個託管對象,還是必須逐個比較每個屬性,以確定它們是否相同或包含差異?比較兩個管理對象的屬性內容?

簡單的例子:

Entity:Pet (Created but not inserted into database) 
Attribute, Name: Brian 
Attribute, Type: Cat 
Attribute, Age: 12 

Entity:Pet (Currently in database) 
Attribute, Name: Brian 
Attribute, Type: Cat 
Attribute, Age: 7 

在這個例子中可以比較我與[Brian, Cat, 12][Brian, Cat, 7],我需要辦理每個屬性逐一查明全場比賽?

+0

你有每種物品的某種唯一標識符?這是一個經常使用的策略。請注意,如果沒有一些獨特的標識符,您將無法擁有兩隻名字和年齡相同的貓作爲不同的貓(這在現實世界中當然是可行的)。 – occulus

回答

1

唯一標識符通常用於僅通過匹配一個字段來搜索對象。正如你注意到的那樣,在多個字段上匹配可能會令人討厭且效率低下,但它可能並沒有你想象的那麼糟糕:你可以構造一個NSPredicate來很容易地匹配核心數據中對象上的所有必填字段。撇開:使用NSPredicate撇開:假設你只想匹配一個字段。如果您提供的數據中沒有合適的唯一標識符,您可以派生出一個。顯而易見的方法是根據您想要匹配的每個字段爲您存儲的所有內容構建一個哈希碼。然後,當您希望檢查「傳入」對象是否已經存在於核心數據中時,計算新對象的哈希碼,然後僅使用該哈希碼查找核心數據中的對象。 (注意:如果你發現一個已經存在的哈希碼相同的對象,你可能想要比較所有的字段來檢查它確實代表了同一個對象 - 這很可能是一個「不同的」對象,又一個哈希碰撞)。

的對象X很天真的散列碼的實施將是這樣的:

hashcode(X) = hashcode(X.name) + hashcode(X.type) + hashcode(X.age) 

要看到寫的哈希碼功能的一個更現實的例子,請參閱接受的答案here

順便說一下,我假設你不想一次將所有對象從核心數據加載到內存中。如果這是可以接受的(假設您的項目數量有限),另一種方法是在您的課程上實施isEqualhash,然後使用常規基礎課程方法(例如NSArray indexOfObject:(或更好的NSDictionary objectForKey:))來定位利益。

+0

感謝您花時間回答Alex,非常感謝。 – fuzzygoat