CoreData и NSXMLParser

Привет, друзья Stackoverflow,

Я анализирую XML-файл сети с помощью NSXMLParser после того, как получил данные из NSURLConnection. В XML много «элементов», и каждый элемент содержит 1 категорию. В модуле CoreData у меня есть объект Item со связью с одной категорией.

При разборе XML-файла и попадании в парсер сообщений: 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;
}}

So what happens is that the context save: call is being called for the currentCategory first while the CurrentItem was not finished creating.


person Edward Ashak    schedule 25.02.2010    source источник


Ответы (2)


Похоже, вы слишком часто сохраняете. Хотя ожидание конца XML-файла для сохранения, вероятно, не лучшая идея, вы, вероятно, захотите подождать, пока не закончите с одной «сущностью».

Тем не менее, я бы порекомендовал также изучить другой парсер. TouchXML может оказаться более полезным для вас, так как он не является таким низкоуровневым, как этот, и может значительно упростить концептуализацию процессов импорта.

person Marcus S. Zarra    schedule 25.02.2010
comment
Это хороший совет, я буду сохранять после каждой сущности. Я не знал, что в конце концов смогу сохранить все, но это кажется намного безопаснее. о TouchXML я посмотрю, я уже скачал его, но я только читаю из XML, поэтому кажется, что NSXMLParser достаточно для задачи. Спасибо - person Edward Ashak; 25.02.2010

Вам не нужно сохранять контекст, пока вы не проанализируете весь файл XML и не вставите все объекты, которые вам нужно вставить. Удалите вызовы -save: в своей подпрограмме синтаксического анализа и просто вызовите ее, когда операция синтаксического анализа завершится.

person Rob Keniger    schedule 25.02.2010
comment
Это хорошая идея, я буду сохранять только в конце цикла каждого элемента, это даст мне полный цикл данных. Спасибо за ответ - person Edward Ashak; 25.02.2010