2009-05-31 11 views
0

私はxmlファイルを読み込んで* nodeというNSArrayの特定のXPathパスにxmlノードを格納するメソッドを持っています。私がしたいのは、配列内のアイテムのそれぞれを取り出し、それをcategoryというコアデータエンティティに "name"という属性で追加することです。NSArray to Coreデータ項目

エンティティを作成するさまざまな方法を試しましたが、これを効果的に行う正しい方法についてはわかりません。これは、NSArrayを作成するために使用されるコードです。これを実装する方法に関するアイデアはありますか?あなたはどの部分マイループコード

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]; 

答えて

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構文を使用しています。これは、インデックス変数を使用するより簡単です。私はiarrayCountを取り除いた。

次に、NSAutoreleasePoolを取り出しました。ループ内のどのオブジェクトもオートリリースされていないので、何の効果もありません。 (newObjectメソッドは、保持されているオブジェクトを返します。これは、通常、名前にnewという名前のメソッドがあります)。これは、アレイコントローラに追加した後にnewObjectをリリースした理由です。この方法ではもう使用しないので、リリースする必要があります。

また、newnewObjectに名前を変更)をNSStringと定義しました。コアデータオブジェクトは、常にNSManagedObjectのインスタンスまたはNSManagedObjectのサブクラスです。

お客様の回線[categoryEl = [nodes objectAtIndex:i]]はコンパイルされません。これは、ブラケット構文を使用してメッセージをオブジェクトに送信するためです。これは代入文なので、ここでは括弧構文は必要ありません。 (for-each構文を使用するようにループを変更したため、この行ももう必要ありません)。しかし、後で参照するためにcategoryEl = [nodes objectAtIndex:i];が働いていました。

1

-

- (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]; 

}

EDIT(私は最終版でこれを修正する、NSErrorを無視します)お困りですか?配列をループすること、各エントリのための新しい管理対象オブジェクトを作成すること、そして正しい属性を設定することより、それ以上のものはありません。 NSEntityDescriptionの-insertNewObjectForEntityForName:inManagedObjectContext:メソッドを使用して管理オブジェクトを作成できます。ここで

+0

私のテストでは、コアデータを削除したので、配列をループすることを学ぶことができました。私は新しい配列コードで私の質問を更新しましたが、それは動作しません。配列をループしてエンティティに追加する最良の方法は何ですか? –