'validateForInsert'中的核心数据失败

时间:2011-03-30 15:23:01

标签: iphone cocoa core-data ios4

对于我正在研究的项目,我正在使用核心数据来存储应用程序的数据。应用程序从Internet加载XML,并尝试将解析结果生成的对象存储在数据模型中。这种情况过去很好,直到几天前。我更改了数据模型(在对象上添加了一个属性),因此我创建了一个新版本并运行了mogenerator来为模型中的对象生成新的存根类。其中大部分仍然可以正常工作,但在代码中有一些奇怪的错误,过去工作得很好。

在解析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。

2 个答案:

答案 0 :(得分:1)

我遇到了这个问题,我通过检查数据长度修复了它。如果您的模型具有字符串字段,则必须验证您传递的字符串不超过字段长度。

答案 1 :(得分:0)

好吧,回答我自己的问题......

3.2.5中没有问题,4.0.1中也没有。看起来苹果在3.2.6 ...

上有一些错误修正