【问题标题】:Parsing and inserting data into SQLITE - ios解析和插入数据到 SQLITE - ios
【发布时间】:2011-12-18 08:40:37
【问题描述】:

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

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

【问题讨论】:

  • 你在 Instruments 下运行过这个吗?它具有广泛的工具,可用于调查资源使用情况并帮助您找到问题所在。
  • 如果我是对的,我认为因为我为遇到的每个返回标签都保存了 managedObjectContext,这就是需要时间的地方。我还有其他方法可以一次存储所有对象吗?

标签: ios sqlite core-data xml-parsing


【解决方案1】:

您应该定期保存 MOC,而不是每次插入。当您要求保存 MOC 时,它会被保存,因此由您决定何时保存。通常,您应该仅在 MOC 与您的需求一致时才保存它(就低级关系而言,它始终是一致的)。无论如何我都会等到解析结束。

【讨论】:

  • 谢谢你的回复...我唯一的疑问是,如果我在解析结束后保存了 MOC,我的所有 objLabPanel 会被存储到数据库中还是只存储最后一个被存储,因为我对遇到的每个返回标签都这样做objLabPanel = [NSEntityDescription insertNewObjectForEntityForName:@"LabPanels" inManagedObjectContext:managedObjectContext];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多