2011-10-30 55 views
1

在我的iPAD應用程序中,我調用Web服務來獲取XML響應,然後解析它並將其存儲到我的SQLITE數據庫中。解析並將數據插入到SQLITE中 - ios

解析和保存正常發生,但我遇到的問題是它需要很長時間才能執行操作。

使用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> 

這將是巨大的,如果有人能幫我解決這個問題,並告訴我,我解析和保存的方式是否有問題。

+0

你在儀器下運行過嗎?它具有廣泛的工具來調查資源使用情況並幫助您找到問題所在。 –

+0

如果我是對的,我認爲自從我爲遇到的每個返回標記保存managedObjectContext時,這就是需要時間的地方。有沒有另一種方法可以讓我一次存儲所有的對象? – learner2010

回答

2

您應該定期保存MOC,而不是每個插入。當您要求保存MOC時,MOC會被保存,因此您需要確定該時間。通常情況下,只有當您的需求一致時才能保存MOC(在低層次關係方面始終保持一致)。無論如何,我都會等到解析結束。

+0

謝謝你的答覆......唯一的疑問是,如果我在解析結束後保存了MOC,那麼我所有的objLabPanel都會被存儲到數據庫還是隻存儲最後一個,因爲我這樣做'objLabPanel = [NSEntityDescription insertNewObjectForEntityForName:@「LabPanels」inManagedObjectContext:managedObjectContext];'我遇到的每一個返回標籤? – learner2010

+0

好吧..我試了一樣,它工作!非常感謝你的幫助... – learner2010