解析和插入数据到SQLITE - ios



在我的iPAD应用程序中,我调用webservice来获取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>

如果有人能帮我解决这个问题,并告诉我我的解析和保存方式是否有问题,那就太好了。

应该定期保存MOC,而不是每次插入都保存。当您要求保存MOC时,MOC将被保存,因此何时保存由您决定。通常情况下,你应该只保存与你的需求一致的MOC(它总是与低级关系一致)。在任何情况下,我会等到解析结束。

最新更新