2009-05-31 8 views
0

J'ai une méthode qui lit un fichier xml et stocke les nœuds xml à un certain chemin XPath dans un NSArray appelé * nœuds. Ce que je veux faire est de prendre chacun des éléments dans le tableau et l'ajouter à une entité de données de base appelée Catégorie avec l'attribut "nom".Éléments de données NSArray to Core

J'ai essayé un certain nombre de façons différentes de créer l'entité, mais je ne suis pas sûr de la façon correcte de le faire efficacement. Ceci est le code utilisé pour créer le NSArray, des idées sur la façon de mettre en œuvre cela? (Ignorer le NSError, je vais corriger cela dans la version finale)

- (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 - Mon code de boucle

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

Répondre

2

Voilà comment je l'écrire:

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

D'abord, j'utilise l'Objective-C 2.0 pour chaque-syntaxe. C'est plus simple que d'utiliser des variables d'index. J'ai éliminé i et arrayCount. Puis, j'ai sorti votre NSAutoreleasePool. Aucun des objets de la boucle n'est auto-libéré, il n'a donc aucun effet. (La méthode newObject retourne un objet retenu qui est, par convention, les méthodes avec le mot new dans leur nom) C'est aussi pourquoi je publie newObject après l'avoir ajouté au contrôleur de tableau. Puisque je ne vais plus l'utiliser dans cette méthode, je dois le libérer.

En outre, vous aviez défini new (que j'ai renommé newObject) en tant que NSString. Les objets de données de base sont toujours une instance de NSManagedObject ou une sous-classe de NSManagedObject. La ligne [categoryEl = [nodes objectAtIndex:i]] ne sera pas compilée. C'est parce que la syntaxe de parenthèse est utilisée pour envoyer un message à un objet. Ceci est une instruction d'affectation, donc la syntaxe de parenthèse n'est pas nécessaire ici. (Cette ligne n'est plus nécessaire non plus car j'ai changé la boucle pour utiliser la syntaxe for-each) Mais, pour référence future, categoryEl = [nodes objectAtIndex:i]; aurait fonctionné.

1

Quelle partie êtes-vous avoir des problèmes avec? Il ne devrait pas y avoir beaucoup plus que boucler à travers le tableau, en créant un nouvel objet géré pour chaque entrée, et en définissant les attributs corrects. Vous pouvez créer l'objet géré avec la méthode -insertNewObjectForEntityForName:inManagedObjectContext: de NSEntityDescription.

+0

Lors de mes tests, j'ai laissé tomber les données de base juste pour que je puisse apprendre à faire une boucle dans la matrice. J'ai mis à jour ma question avec le nouveau code de tableau mais cela ne marche pas. Quel est le meilleur moyen de faire une boucle dans le tableau et de l'ajouter à une entité? –