2011-03-30 5 views
0

프로젝트에서 핵심 데이터를 사용하여 애플리케이션의 데이터를 저장하고 있습니다. 응용 프로그램은 인터넷에서 XML을로드하고 파싱 된 결과에서 생성 된 객체를 데이터 모델에 저장하려고합니다. 며칠 전까지는 제대로 작동하지 않았습니다. 데이터 모델을 변경 (개체에 하나의 속성 추가)하여 새 버전을 만들고 모델의 개체에 대한 새 스텁 클래스를 생성하기 위해 mogenerator를 실행했습니다. 그것의 대부분은 여전히 ​​잘 작동하지만 완벽하게 작동하는 데 사용 된 코드에는 이상한 오류가 있습니다.'validateForInsert'에서 핵심 데이터가 실패합니다.

XML을 구문 분석하는 동안 개체가 만들어지고 값이 채워집니다. 값 중 하나는 이미지의 URL입니다. 데이터 모델에서이 값은 NIL이 아니지만 XML에서는 종종 발생합니다. 항목에 validateForInsert를 사용하여 커밋 할 수 있는지 확인합니다. 이것은 잘 작동하는 데 사용되는 부분이지만 NIL 값에 대해 불만을 토로합니다.

파서에서 코드의 비트 : 다음

... 
    currentItem = [[[MyItem alloc] initWithEntity:[self.dataModel entityByName:@"MyItem"] insertIntoManagedObjectContext:self.dataModel.managedObjectContext] autorelease]; 
    currentItem.label = [attributeDict objectForKey:LABEL]; 
    currentItem.paramString = [attributeDict objectForKey:QUERY_STRING]; 
    [currentItem setSortOrderValue:[[currentRootItem items] count]]; 

    [currentRootItem addItemsObject:currentItem]; 
} else if ([elementName isEqualToString:IMAGE]) { 
    currentItem.imageLocation = [attributeDict objectForKey:IMAGE_URL]; 
... 

, 문서를 구문 분석, 내가 체크 :

... 
    { 
     NSArray *Items = [[myRootItem items] allObjects]; 
     for (MyItem *item in Items) { 
      NSLog(@"%@", item); 
      NSLog(@"before"); 
      NSLog(@"%d", [item validateForInsert:&validationError]); 
      NSLog(@"after"); 
      if (![item validateForInsert:&validationError]) { 
       [[self.dataModel managedObjectContext] deleteObject:item]; 
      } 
     } 
    } 
... 

이 잘 작동하는 데 사용하지만, 지금은 충돌 validateForInsert에서 :

2011-03-30 13:38:32.951 xx[915:207] before 
2011-03-30 13:38:33.130 xx[915:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Property/imageLocation/Entity/Item)' 

스택 트레이스 :

0 CoreFoundation      0x022fc5a9 __exceptionPreprocess + 185 
1 libobjc.A.dylib      0x02450313 objc_exception_throw + 44 
2 CoreFoundation      0x022b4ef8 +[NSException raise:format:arguments:] + 136 
3 CoreFoundation      0x022b4e6a +[NSException raise:format:] + 58 
4 CoreFoundation      0x022fae15 -[__NSCFDictionary setObject:forKey:] + 293 
5 CoreData       0x013fa87c -[NSValidationErrorLocalizationPolicy _cachedObjectForKey:value:] + 172 
6 CoreData       0x013fa629 -[NSValidationErrorLocalizationPolicy _localizedPropertyNameForProperty:entity:] + 201 
7 CoreData       0x013fa4e7 -[NSValidationErrorLocalizationPolicy localizedPropertyNameForProperty:] + 71 
8 CoreData       0x013a844e -[NSManagedObject(_NSInternalMethods) _substituteEntityAndProperty:inString:] + 142 
9 CoreData       0x013a572e -[NSManagedObject(_NSInternalMethods) _generateErrorWithCode:andMessage:forKey:andValue:additionalDetail:] + 254 
10 CoreData       0x013598f1 -[NSPropertyDescription(_NSInternalMethods) _nonPredicateValidateValue:forKey:inObject:error:] + 161 
11 CoreData       0x01359485 -[NSAttributeDescription(_NSInternalMethods) _nonPredicateValidateValue:forKey:inObject:error:] + 85 
12 CoreData       0x01358b22 -[NSManagedObject(_NSInternalMethods) _validateValue:forProperty:andKey:withIndex:error:] + 386 
13 CoreData       0x01358847 -[NSManagedObject(_NSInternalMethods) _validatePropertiesWithError:] + 263 
14 CoreData       0x013586e1 -[NSManagedObject(_NSInternalMethods) _validateForSave:] + 81 
15 xx         0x001af8bf -[MyParser parserDidEndDocument:] + 1039 
16 Foundation       0x00742717 _endDocument + 95 

무엇이 잘못되었는지 알 수 없습니다. 내가 아는 한 데이터 모델의 새 버전을 만드는 것이 XCode를 사용하여 올바르게 진행되고 현재 버전으로 설정하는 등 모든 작업이 올바르게 진행되었습니다. 나는이 모든 것을 마지막으로 할 때 이러한 문제가 없었습니다 ...

유일한 차이점은 이제 3.2.5 또는 3.2.4에서 XCode 3.2.6으로 업그레이드된다는 것입니다. 기억이 안납니다. .

내 대상은 iPhone이며이 버전의 XCode와 함께 제공되는 4.3 iOS SDK를 사용하고 있습니다.

답변

0

음,

문제는 3.2.5에서이없는 ... 내 자신의 질문에 대답 않으며 4.0.1에있다. Apple에 3.2.6에서 수행 할 버그 수정이있는 것 같습니다.

+0

... 그리고 그들은 그렇게 보입니다. 3 월 25 일에 릴리스 된 xcode 버전은 정상적으로 작동하는 것 같습니다. 사이트에 우리에게 알려주는 것이 없기 때문에 3.2.6의 출시일이 갑자기 바뀌 었습니다. – Emiel

1

이 문제가있어서 데이터 길이를 검사하여 문제를 해결했습니다. 모델에 문자열 필드가있는 경우 전달중인 String이 필드 길이를 초과하지 않는지 확인해야합니다.

관련 문제