NSArray для базовых элементов данных - PullRequest
0 голосов
/ 31 мая 2009

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

Я пробовал несколько различных способов создания сущности, но я не уверен в правильном способе сделать это эффективно. Это код, используемый для создания NSArray, есть идеи, как это реализовать? (игнорируйте ошибку NSE, я исправлю это в окончательной версии)

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

Ответы [ 2 ]

2 голосов
/ 01 июня 2009

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

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

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

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

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

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

1 голос
/ 31 мая 2009

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

...