1

Stackoverflow の皆さん、こんにちは。

NSURLConnection からデータを取得した後、NSXMLParser を使用してネットワークの XML ファイルを解析しています。XML には多くの「項目」があり、各項目には 1 つのカテゴリが含まれています。CoreData モジュールには、1 つのカテゴリとの関係を持つ Item エンティティがあります。

XML ファイルを解析し、"Item" 要素でメッセージ parser:didStartElement:... をヒットしているときに、Item の NSEntityDescription を作成します。次に、パーサーはメッセージ parser:didStartElement:... で再びカテゴリ項目を受け取り、カテゴリの 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 に対してコンテキスト save: 呼び出しが呼び出されます。

4

2 に答える 2

3

保存の頻度が高すぎるようです。XML ファイルの最後まで保存するのを待つのはおそらく良い考えではありませんが、1 つの「エンティティ」が完成するまで待つことをお勧めします。

ただし、別のパーサーも検討することをお勧めします。TouchXML は、これほど低レベルではなく、インポート プロセスの概念化をはるかに簡単にすることができるため、より便利な場合があります。

于 2010-02-25T14:03:19.673 に答える
2

XML ファイル全体を解析し、挿入する必要があるすべてのオブジェクトを挿入するまで、コンテキストを保存する必要はありません。解析ルーチンの呼び出しを削除し-save:、解析操作が完了したときに呼び出します。

于 2010-02-25T02:39:29.473 に答える