1

안녕 유래 친구,CoreData 및 NSXMLParser

는 내가있는 NSURLConnection에서 데이터를 얻었다 후 NSXMLParser를 사용하여 네트워크의 XML 파일을 구문 분석하고있다. XML에는 많은 "항목"이 있으며 각 항목에는 범주가 1 개 있습니다. CoreData 모듈에는 하나의 범주에 대한 관계가있는 항목 엔터티가 있습니다.

XML 파일을 구문 분석하고 메시지 파서를 치는 동안 : didStartElement : ... "Item"요소를 사용하여 Item에 대한 NSEntityDescription을 만듭니다. 그런 다음 파서가 메시지 parser : didStartElement에 Category 항목을 다시 도착시키고 Category에 대한 NSEntityDescription을 만듭니다.

는 XML :

<item> 

<title>Plates</title> 

<category>Kitchen</category> 

<price>14</price> 

<picture></picture> 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict { 


//Started reading an Item Element, init currentItemObject 
if ([elementName isEqualToString:@"Item"]) { 
    [self.currStringFound setString:@""]; 
    currentItemObject = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[self managedObjectContext]]; 
    return; 
} 

//Started Title element 
if ([elementName isEqualToString:kTitleElementName]) { 
    [self.currStringFound setString:@""]; 
} 

//Started Category element 
if ([elementName isEqualToString:kCategoryElementName]) { 
    currentCategory = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:[self managedObjectContext]]; 
    [self.currStringFound setString:@""]; 
} 
} 



- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName { 

if ([elementName isEqualToString:kItemElementName]) { 
    //save the item to CoreData 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"could not save Item"); 
     exit(1); 
    } 
    return; 
} 

//Started Category element 
if ([elementName isEqualToString:kCategoryElementName]) { 
    currentCategory.title = self.currStringFound; 
    NSLog(@"Category = %@",self.currStringFound); 
    NSManagedObjectContext *context = [self managedObjectContext]; 
    NSError *error; 
    if (![context save:&error]) { 
     NSLog(@"could not save Item"); 
     exit(1); 
    } 
    return; 
}} 

그래서 무슨 일하는 저장 맥락이다 : 호출이 먼저 CurrentItem이 작성을 완료되지 않은 상태에서 currentCategory 요구되고있다.

답변

3

너무 자주 저장하는 것처럼 보입니다. 저장할 XML 파일의 끝까지 기다리는 것은 좋은 생각이 아닙니다. 아마도 하나의 "엔티티"를 마칠 때까지 기다려야 할 것입니다.

그러나 다른 구문 분석기를 사용하는 것이 좋습니다. TouchXML은 이보다 낮은 수준이 아니기 때문에 더 유용 할 수 있으며 가져 오기 프로세스를 훨씬 쉽게 개념화 할 수 있습니다.

+0

이것은 유용한 팁입니다. 각 엔티티 후에 저장하게됩니다. 나는 결국 모든 것을 저장할 수 있다는 것을 알지 못했지만 이것은 훨씬 안전 해 보입니다. touchXML에 대해 나는 그것을 이미 다운로드 한 것입니다,하지만 난 단지 XML에서 읽기 때문에 그것은 NSXMLParser이 작업을 위해 충분한 것 같습니다. 감사합니다. –

2

전체 XML 파일을 구문 분석하고 삽입해야하는 모든 개체가 삽입 될 때까지 컨텍스트를 저장할 필요가 없습니다. 구문 분석 루틴에서 -save: 호출을 제거하고 구문 분석 작업이 완료되면 호출하십시오.

+0

그게 좋은 생각인데, 각 항목 루프 끝 부분에만 저장하면 데이터의 전체주기가 나옵니다. 답장을 보내 주셔서 감사합니다. –