对于我正在处理的项目,我正在使用核心数据来存储应用程序的数据。应用程序从互联网载入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),将其设置为当前版本等,都是正确的。我没有这些问题上次我做了所有这些...
唯一不同的是,现在我升级到XCode 3.2.6,从3.2.5或3.2.4,我不记得了。
我的目标是iPhone,我使用的是这个版本的XCode附带的4.3 iOS SDK。
......看起来他们做到了。 3月25日发布的xcode版本似乎工作正常。并不是说他们的网站上有任何内容告诉我们,只是3.2.6的发布日期突然改变了。 – Emiel 2011-04-04 08:57:56