Разбор и вставка данных в SQLITE - ios - PullRequest
1 голос
/ 31 октября 2011

В моем приложении iPAD я вызываю веб-сервис для получения XML-ответа, затем анализирую его и сохраняю в своей базе данных SQLITE.

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

Используя Mac, я увидел количество записей, сохраняемых в базе данных.Это было 395 строк, где в каждой строке по 8 столбцов, т.е. около 3100 записей хранятся в моей базе данных (моя сущность имеет 8 атрибутов).На iPAD вся операция занимает около 25 секунд, что, как мне сказали, слишком долго.Я не могу понять, почему это занимает так много времени и где я ошибаюсь.

Это код, который я использую для анализа XML и хранения -

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict
{
    if ([elementName isEqualToString:@"return"])
    {
        // Blank lab panel object
        objLabPanel = [NSEntityDescription insertNewObjectForEntityForName:@"LabPanels" inManagedObjectContext:managedObjectContext];
        mainElement = elementName;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{
    elementValue = [[NSMutableString alloc] init];
    [elementValue appendString:string];

    // Handle html codes
    elementValue = [CommonHelper encodeHTMLCharactorsForDataBaseStorage:elementValue];
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"return"])
    {
        [objPatient addLabPanelsObject:objLabPanel];

        // Save
        NSError *error = nil;
        BOOL saveObj = FALSE;
        saveObj = [managedObjectContext save:&error];

        if (saveObj == FALSE)
        {
            NSLog (@"Error: %@", error);
        }
    }
    else if ([elementName isEqualToString:@"batteryID"] && [mainElement isEqualToString:@"return"])
    {
        objLabPanel.labPanelBatteryId = elementValue;
    }
    else if ([elementName isEqualToString:@"batteryVersionNum"] && [mainElement isEqualToString:@"return"])
    {
        objLabPanel.labBatteryVersionId = elementValue;
    }
    else if ([elementName isEqualToString:@"conceptCode"] && [mainElement isEqualToString:@"return"])
    {
        objLabPanel.labPanelCode = elementValue;
    }
    else if ([elementName isEqualToString:@"conceptDescription"] && [mainElement isEqualToString:@"return"])
    {
        objLabPanel.labPanelDesc = elementValue;
    }
    else if ([elementName isEqualToString:@"effectiveEndTime"] && [mainElement isEqualToString:@"return"])
    {
        endDate = [CommonHelper getDateFromXMLString:[NSString stringWithString:elementValue] :@"yyyy-MM-dd'T'HHmmssZ"];
        objLabPanel.labPanelEndDate  = endDate;
    }
    else if ([elementName isEqualToString:@"effectiveStartTime"] && [mainElement isEqualToString:@"return"])
    {
        startDate = [CommonHelper getDateFromXMLString:[NSString stringWithString:elementValue] :@"yyyy-MM-dd'T'HHmmssZ"];
        objLabPanel.labPanelStartDate = startDate;
    }
    else if ([elementName isEqualToString:@"body"])
    {
        // Release all variables at the end of xml parsing
        [self releaseVariables];
    }

    elementValue = nil;
}

Вотобразец XML-кода, который я анализирую -

<return>
<batteryID>1234</batteryID>
<batteryVersionNum>1</batteryVersionNum>
<conceptCode>abc</conceptCode>
<conceptDescription>abc</conceptDescription>
<effectiveEndTime>2010-11-23</effectiveEndTime>
<effectiveStartTime>2010-11-23</effectiveStartTime>
</return>
<return>
<batteryID>2345</batteryID>
<batteryVersionNum>1</batteryVersionNum>
<conceptCode>bac</conceptCode>
<conceptDescription>bac</conceptDescription>
<effectiveEndTime>2010-11-23</effectiveEndTime>
<effectiveStartTime>2010-11-23</effectiveStartTime>
</return>

Было бы замечательно, если бы кто-то мог помочь мне с этим и сказать мне, если что-то не так с моим анализом и сохранением.

1 Ответ

2 голосов
/ 31 октября 2011

Вы должны сохранять MOC периодически, не для каждой вставки.MOC сохраняется, когда вы запрашиваете его сохранение, поэтому вы сами должны определить, когда это произойдет.Как правило, вы должны сохранять MOC только в том случае, если он соответствует вашим потребностям (он всегда соответствует вашим отношениям низкого уровня).Я бы подождал до конца разбора в любом случае.

...