2012-11-26 4 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, 7][Brian, Cat, 12]을 비교하거나 I 전체 일치를 확인하기 위해 하나 각 속성 하나를 통해 갈 필요가 할 수 있습니까?

+0

각 항목마다 고유 한 식별자가 있습니까? 그것은 종종 사용되는 전략입니다. 고유 한 식별자가 없으면 별명 고양이와 같은 이름과 나이를 가진 두 마리의 고양이를 가질 수 없습니다 (현실 세계에서는 가능합니다). – occulus

답변

1

고유 식별자는 종종 하나의 필드와 일치하도록함으로써 개체를 검색하는 데 사용됩니다. 당신이 참고로, 여러 필드에 일치하는 것은 성가신 비효율적 일 수 있지만, 당신이 생각으로는 아마도 나쁘지 않아 : 당신은 NSPredicate이 아주 쉽게 코어 데이터에서 개체의 모든 필수 필드에 맞게 구성 할 수 있습니다.

NSPredicate을 제쳐두고 사용하십시오. 하나의 필드를 일치 시키려한다고 가정 해보십시오. 제공된 데이터에 적합한 고유 식별자가없는 경우 하나를 파생시킬 수 있습니다. 분명한 방법은 일치시키려는 각 필드를 기반으로 저장하는 모든 것에 대한 해시 코드를 생성하는 것입니다. 그런 다음 '들어오는'객체가 이미 핵심 데이터에 있는지 확인하려는 경우 새 객체의 해시 코드를 계산 한 다음 해당 해시 코드로 핵심 데이터에서 객체를 찾습니다. (참고 : 이미 동일한 해시 코드로 존재하는 객체를 발견하면 모든 객체를 비교하여 실제로 동일한 객체를 나타내는 지 확인하십시오. '다른 객체'일 가능성은 매우 희박합니다. , 일명 해시 충돌).

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

은 해시 함수를 작성하는보다 현실적인 예를 보려면 허용 대답 here 참조 : 객체 X에 대한

매우 순진 해시 코드 구현 뭔가처럼 될 것입니다.

그건 그렇고, 난 당신이 한 번에 메모리에 핵심 데이터에서 모든 개체를로드하고 싶지 않아요. 그러나 허용되는 경우 (꽤 제한된 항목이 있다고 가정), 대안으로 isEqualhash을 클래스에 구현 한 다음 NSArray indexOfObject: (또는 더 좋게는 NSDictionary objectForKey:)과 같은 기본 클래스 클래스 메서드를 사용하여 관심.

+0

알렉스에게 대답 해 주셔서 감사합니다. 많은 감사를드립니다. – fuzzygoat

관련 문제