1

嗨 Stackoverflow 的朋友们,

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

在解析 XML 文件并使用“Item”元素点击消息 parser:didStartElement:... 时,我为 Item 创建了一个 NSEntityDescription。然后解析器在消息解析器中再次到达类别项目: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 调用 context save: 调用。

4

2 回答 2

3

您似乎保存得太频繁了。虽然等到 XML 文件结束才保存可能不是一个好主意,但您可能确实希望等到完成一个“实体”。

但是,我建议您也研究一个不同的解析器。TouchXML 可能对您更有用,因为它没有这个级别那么低,并且可以使导入过程的概念化变得更加容易。

于 2010-02-25T14:03:19.673 回答
2

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

于 2010-02-25T02:39:29.473 回答