CoreData和NSXMLParser

时间:2010-02-25 01:21:54

标签: objective-c cocoa-touch core-data nsxmlparser nsmanagedobject

您好Stackoverflow的朋友,

我从NSURLConnection获取数据后使用NSXMLParser解析网络的XML文件。 XML有许多“项目”,每个项目包含1个类别。 在CoreData模块中,我有一个Item实体,它与一个Category有关系。

解析XML文件并点击消息解析器:didStartElement:... with“Item”元素我为Item创建了一个NSEntityDescription。然后解析器再次在消息解析器中到达Category项:didStartElement:...并且我为Category创建了一个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。

2 个答案:

答案 0 :(得分:3)

您似乎过于频繁地保存。在等待保存的XML文件结束时可能不是一个好主意,您可能希望等到完成一个“实体”。

但是,我建议您同时查看其他解析器。 TouchXML可能对您更有用,因为它不像这样低级,并且可以更容易地概念化导入过程。

答案 1 :(得分:2)

在解析整个XML文件并插入需要插入的所有对象之前,无需保存上下文。删除解析例程中的-save:调用,并在解析操作完成时调用它。