Stackoverflow の皆さん、こんにちは。
NSURLConnection からデータを取得した後、NSXMLParser を使用してネットワークの XML ファイルを解析しています。XML には多くの「項目」があり、各項目には 1 つのカテゴリが含まれています。CoreData モジュールには、1 つのカテゴリとの関係を持つ Item エンティティがあります。
XML ファイルを解析し、"Item" 要素でメッセージ parser:didStartElement:... をヒットしているときに、Item の NSEntityDescription を作成します。次に、パーサーはメッセージ parser:didStartElement:... で再びカテゴリ項目を受け取り、カテゴリの NSEntityDescription を作成します。
XML:
<item>
<title>Plates</title>
<category>Kitchen</category>
<price>14</price>
<picture></picture>
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
//Started reading an Item Element, init currentItemObject
if ([elementName isEqualToString:@"Item"]) {
[self.currStringFound setString:@""];
currentItemObject = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[self managedObjectContext]];
return;
}
//Started Title element
if ([elementName isEqualToString:kTitleElementName]) {
[self.currStringFound setString:@""];
}
//Started Category element
if ([elementName isEqualToString:kCategoryElementName]) {
currentCategory = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:[self managedObjectContext]];
[self.currStringFound setString:@""];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:kItemElementName]) {
//save the item to CoreData
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
if (![context save:&error]) {
NSLog(@"could not save Item");
exit(1);
}
return;
}
//Started Category element
if ([elementName isEqualToString:kCategoryElementName]) {
currentCategory.title = self.currStringFound;
NSLog(@"Category = %@",self.currStringFound);
NSManagedObjectContext *context = [self managedObjectContext];
NSError *error;
if (![context save:&error]) {
NSLog(@"could not save Item");
exit(1);
}
return;
}}
したがって、CurrentItem の作成が完了していない間に、最初に currentCategory に対してコンテキスト save: 呼び出しが呼び出されます。