CoreData и NSXMLParser - PullRequest
       35

CoreData и NSXMLParser

1 голос
/ 25 февраля 2010

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

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

При разборе файла XML и обращении к анализатору сообщений: didStartElement: ... с элементом "Item" я создаю NSEntityDescription для Item. Затем синтаксический анализатор снова получает элемент Category в анализаторе сообщений: didStartElement: ... и я создаю NSEntityDescription для Category.

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;
}}

Так что происходит, что контекстное сохранение: вызов вызывается для currentCategory сначала, пока CurrentItem не завершил создание.

Ответы [ 2 ]

3 голосов
/ 25 февраля 2010

Вы, кажется, экономите слишком часто. Хотя ожидание до конца сохраняемого файла XML, вероятно, не очень хорошая идея, вам, вероятно, стоит подождать, пока вы закончите с одним «объектом».

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

2 голосов
/ 25 февраля 2010

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

...