Domanda

Ho un metodo che legge un file XML e memorizza i nodi XML in un certo XPath-path in un NSArray chiamati nodi *. Quello che voglio fare è prendere ognuno degli elementi nella matrice e inserirlo ad un'entità di dati di base chiamato Categoria con l'attributo di "nome".

Ho provato un certo numero di modi diversi di creazione dell'entità ma non sono sicuro circa il modo corretto per farlo in modo efficace. Questo è il codice utilizzato per creare la NSArray, tutte le idee su come implementare questa? (Ignorare il NSError, io risolvere questo problema nella versione 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];

}

Modifica - Il mio codice ciclo

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];
È stato utile?

Soluzione

Ecco come mi piacerebbe scrivere che:

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

Per prima cosa, sto usando l'Objective-C 2.0 for-each sintassi. Questo è più semplice rispetto all'utilizzo di variabili indice. Ho eliminato i e arrayCount.

Successivamente, ho tirato fuori il tuo NSAutoreleasePool. Nessuno degli oggetti nel circuito siano autoreleased, quindi non ha avuto effetto. (Il metodo newObject restituisce un oggetto che è trattenuto, per convenzione, quali metodi con la parola new nel loro nome fare) Anche per questo io rilascio newObject dopo l'aggiunta al controller dell'array. Dal momento che non ho intenzione di essere di utilizzarlo più in questo metodo, ho bisogno di rilasciarlo.

new Inoltre, si era definito (che ho rinominato newObject) come NSString. oggetti principali di dati sono sempre o un'istanza di NSManagedObject o di una sottoclasse di NSManagedObject.

La linea [categoryEl = [nodes objectAtIndex:i]] non verrà compilato. Questo perché la sintassi staffa viene utilizzata per inviare un messaggio a un oggetto. Si tratta di un'istruzione di assegnazione, quindi la sintassi staffa non è necessario qui. (Questa linea non è più necessario anche a causa della ho cambiato il ciclo di utilizzare la for-each sintassi) Ma, per riferimento futuro, categoryEl = [nodes objectAtIndex:i]; avrebbe funzionato.

Altri suggerimenti

Quale parte stai avendo problemi con? Non ci dovrebbe essere molto di più ad esso che il ciclo attraverso l'array, la creazione di un nuovo oggetto gestito per ogni voce, e impostando gli attributi corretti. È possibile creare l'oggetto gestito con il metodo -insertNewObjectForEntityForName:inManagedObjectContext: di NSEntityDescription.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top