2011-10-30 9 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

これをInstrumentsで実行しましたか?リソースの使用状況を調査し、問題がどこにあるかを見つけるのに役立つ幅広いツールがあります。 –

+0

私が正しいとすれば、私が直面しているリターンタグごとにmanagedObjectContextを保存するので、それは時間がかかる場所です。一度にすべてのオブジェクトを保存する別の方法がありますか? – learner2010

答えて

2

定期的にMOCを保存してください。挿入するたびに保存する必要はありません。 MOCは保存するように求められたときに保存されるため、いつMOCを判断するかはあなた次第です。通常、MOCはニーズの点で一貫している場合にのみ保存してください(低レベルの関係では常に一貫しています)。私はどのような場合でも解析の終わりまで待つだろう。

+0

返事ありがとうございました...私が持っていた唯一の疑問は、解析が終了したらMOCを保存した場合、すべてのobjLabPanelがデータベースに格納されるか、最後に格納されるだけです'objLabPanel = [NSEntityDescription insertNewObjectForEntityForName:@" LabPanels "inManagedObjectContext:managedObjectContext];'私が遭遇するすべてのリターンタグについて? – learner2010

+0

まあ、私も同じことをやってみました!助けてくれてありがとう... – learner2010

関連する問題