Массовое хранение в SQLite при разборе в iOS - PullRequest
0 голосов
/ 31 октября 2011

В моем приложении для iOS я анализирую XML из веб-службы на основе SOAP и сохраняю его в базе данных SQLITE.Проблема, с которой я сталкиваюсь, заключается в том, что это очень медленно.Для примерно 310 строк данных требуется около 18 секунд.

Вот пример моего 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>

Я использую синтаксический анализатор NSXML для анализа 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 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;
    }
    // getting other values from the xml
    . 
    .
    .
    }

Следовательно, для каждого тега возврата, с которым я сталкиваюсь, я сохраняю базу данных и, таким образом, для своих примерно 310 записей я бы сохранял его 310 раз.Так что, выполнив [managedObjectContext save:&error];, я предполагаю, что он открывает базу данных, сохраняет данные и закрывает базу данных, и, следовательно, это занимает много времени.Правильно ли я так думаю?

Есть ли способ, которым я могу сохранить все objLabPanel в массив и затем выполнить массовую вставку в базу данных, то есть массовую вставку всего массива objLabPanel в базу данных SQLITE одновременно?

Этобыло бы здорово, если бы кто-то мог помочь мне с этим.

1 Ответ

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

Сохранять изменения следует только после завершения импорта всех записей. Нет необходимости сохранять его после каждой вставки. Также прочитайте Руководство по программированию основных данных: эффективный импорт данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...