NSArray для основных элементов данных

У меня есть метод, который читает файл xml и сохраняет узлы xml по определенному пути XPath в NSArray с именем *nodes. Что я хочу сделать, так это взять каждый из элементов в массиве и добавить его в основной объект данных, называемый категорией, с атрибутом «имя».

Я пробовал несколько разных способов создания сущности, но я не уверен, как правильно это сделать. Это код, используемый для создания 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];

person Alex Mills    schedule 31.05.2009    source источник


Ответы (2)


Вот как я бы это написал:

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

Во-первых, я использую синтаксис for-each из Objective-C 2.0. Это проще, чем использование индексных переменных. Я устранил i и arrayCount.

Далее я достал свой NSAutoreleasePool. Ни один из объектов в цикле не освобождается автоматически, поэтому это не имело никакого эффекта. (Метод newObject возвращает сохраненный объект, который, по соглашению, является тем, что делают методы со словом new в своем имени). Именно поэтому я освобождаю newObject после добавления его в контроллер массива. Поскольку я больше не буду использовать его в этом методе, мне нужно его выпустить.

Кроме того, вы определили new (которое я переименовал в newObject) как NSString. Объекты Core Data всегда являются либо экземпляром NSManagedObject, либо подклассом NSManagedObject.

Ваша строка [categoryEl = [nodes objectAtIndex:i]] не будет компилироваться. Это связано с тем, что синтаксис скобок используется для отправки сообщения объекту. Это оператор присваивания, поэтому синтаксис квадратных скобок здесь не нужен. (Эта строка также больше не нужна, потому что я изменил цикл, чтобы использовать синтаксис for-each). Но для дальнейшего использования categoryEl = [nodes objectAtIndex:i]; сработало бы.

person Alex    schedule 01.06.2009

С какой частью у вас проблемы? Это не должно быть чем-то большим, чем перебор массива, создание нового управляемого объекта для каждой записи и установка правильных атрибутов. Вы можете создать управляемый объект с помощью метода -insertNewObjectForEntityForName:inManagedObjectContext: NSEntityDescription.

person Marc Charbonneau    schedule 31.05.2009
comment
В своем тестировании я отбрасывал основные данные только для того, чтобы научиться перебирать массив в цикле. Я обновил свой вопрос новым кодом массива, но он не работает. Каков наилучший способ перебрать массив и добавить его в сущность? - person Alex Mills; 31.05.2009