Frage

Ich habe eine Methode, die eine XML-Datei liest und speichert der XML-Knoten in einem bestimmten XPath-Pfad in einem NSArray * Knoten genannt. Was ich tun möchte, ist jedes der Elemente im Array nehmen und fügen Sie es zu einem Kerndateneinheit genannt Kategorie mit dem Attribut „name“.

Ich habe eine Reihe von verschiedenen Möglichkeiten versucht, die Einheit zu schaffen, aber ich bin über die richtige Art und Weise nicht sicher, ob dies effektiv zu tun. Dies ist der Code verwendet, um die NSArray zu erstellen, alle Ideen auf, wie dies zu implementieren? (Ignorieren Sie die NSError, werde ich dieses Problem beheben in der endgültigen Fassung)

- (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 - My Schleife Code

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];
War es hilfreich?

Lösung

Hier ist, wie ich es schreiben würde:

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

Erstens, ich bin mit der Objective-C 2.0 for-each Syntax. Dies ist einfacher als Indexvariablen verwendet wird. Ich eliminiert i und arrayCount.

Als nächstes nahm ich Ihre NSAutoreleasePool aus. Keines der Objekte in der Schleife sind Autoreleased, so dass es keine Wirkung hatte. (Die newObject Methode gibt ein Objekt, das festgehalten ist, durch Konvention, welche Methoden mit dem Wort new in ihrem Namen tun) Dies auch deshalb newObject I freisetzen, nachdem sie an der Array-Controller hinzugefügt wird. Da würde ich verwende es nicht mehr in diesem Verfahren muß ich um sie lösen.

Außerdem hatte man definiert new als newObject (die ich NSString umbenannt). Core Data-Objekte sind immer entweder eine Instanz von NSManagedObject oder eine Unterklasse von NSManagedObject.

Ihre Linie [categoryEl = [nodes objectAtIndex:i]] wird nicht kompiliert. Das ist, weil die Klammer-Syntax verwendet wird, eine Nachricht an ein Objekt zu senden. Dies ist eine Zuweisungsanweisung, so dass die Klammer-Syntax hier nicht erforderlich ist. (Diese Linie ist notwendig, auch nicht mehr, weil ich die Schleife geändert haben zu verwenden, die foreach-Syntax) Aber für die Zukunft, categoryEl = [nodes objectAtIndex:i]; gearbeitet hätte.

Andere Tipps

Was Teil Haben Sie Probleme mit? Es soll nicht viel mehr sein, als durch das Array Looping, ein neues verwaltete Objekts für jeden Eintrag Erstellen und Einstellen der richtigen Attribute. Sie können das verwaltete Objekt mit NSEntityDescription der -insertNewObjectForEntityForName:inManagedObjectContext: Methode erstellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top