0

私は、xml ファイルを読み取り、*nodes と呼ばれる NSArray の特定の XPath パスに xml ノードを格納するメソッドを持っています。私がやりたいことは、配列内の各アイテムを取得し、「名前」の属性を持つカテゴリと呼ばれるコア データ エンティティに追加することです。

エンティティを作成するさまざまな方法を試しましたが、これを効果的に行う正しい方法がわかりません。これは NSArray を作成するために使用されるコードですが、これを実装する方法についてのアイデアはありますか? (NSError は無視してください。最終バージョンで修正します)

- (IBAction)readCategories:(id)sender

{

NSString *xmlString = [resultView string];

NSData *xmlData = [xmlString dataUsingEncoding: NSASCIIStringEncoding];

NSXMLDocument *xmlDoc = [[NSXMLDocument alloc] initWithData:xmlData options:nil error:nil];

//XPath

NSError *err=nil;

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];

}

編集 - 私のループコード

NSArray *nodes = [xmlDoc nodesForXPath:@"//member[name='description']/value/string" error:&err];
int arrayCount = [nodes count];
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSXMLElement *categoryEl;
NSString *new = [catArrayController newObject];
int i;
for (i = 0; i < arrayCount; i++)
{
    [categoryEl = [nodes objectAtIndex:i]];
    [new setValue:[categoryEl stringValue] forKey:@"name"];
    [catArrayController addObject:new];
}
[pool release];
4

2 に答える 2

2

これが私がそれを書く方法です:

for (NSXMLElement *categoryElement in nodes) {
    NSManagedObject *newObject = [catArrayController newObject];
    [newObject setValue:[categoryElement stringValue] forKey:@"name"];
    [catArrayController addObject:newObject];
    [newObject release];
}

まず、Objective-C 2.0 の for-each 構文を使用しています。これは、インデックス変数を使用するよりも簡単です。iとをなくしarrayCountました。

次に、あなたの を取り出しましたNSAutoreleasePool。ループ内のオブジェクトはどれも自動解放されないため、効果はありませんでした。(newObjectメソッドは、保持されたオブジェクトを返します。これは、慣例により、名前に単語が含まれるメソッドが行うことです) これが、配列コントローラーに追加した後newに解放する理由でもあります。newObjectこのメソッドではもう使用しないので、解放する必要があります。

newまた、 (名前を変更newObjectした) を として定義していましたNSString。Core Data オブジェクトは、常に のインスタンスNSManagedObjectまたはサブクラスのいずれかですNSManagedObject

あなたの行[categoryEl = [nodes objectAtIndex:i]]はコンパイルされません。これは、メッセージをオブジェクトに送信するためにブラケット構文が使用されるためです。これは割り当てステートメントなので、ここではブラケット構文は必要ありません。(for-each 構文を使用するようにループを変更したため、この行も不要になりました) しかし、今後の参考のために、categoryEl = [nodes objectAtIndex:i];機能していたはずです。

于 2009-06-01T14:28:20.143 に答える
1

どの部分でお困りですか?配列をループし、エントリごとに新しい管理対象オブジェクトを作成し、正しい属性を設定するだけです。NSEntityDescription の-insertNewObjectForEntityForName:inManagedObjectContext:メソッドで管理対象オブジェクトを作成できます。

于 2009-05-31T06:58:28.687 に答える