NSArray到核心数据项

时间:2009-05-31 06:27:03

标签: cocoa core-data nsarray

我有一个读取xml文件的方法,并将xml节点存储在名为* nodes的NSArray中的某个XPath路径上。我想要做的是获取数组中的每个项目,并将其添加到名为Category的核心数据实体,其属性为“name”。

我已经尝试了许多不同的创建实体的方法,但我不确定有效地执行此操作的正确方法。这是用于创建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];

2 个答案:

答案 0 :(得分:2)

以下是我写的方式:

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

首先,我使用Objective-C 2.0 for-each语法。这比使用索引变量更简单。我删除了iarrayCount

接下来,我拿出了你的NSAutoreleasePool。循环中的所有对象都没有自动释放,因此它没有任何效果。 (newObject方法返回一个保留的对象,按照惯例,它的名称中包含new字的方法。这也是我将newObject添加到数组后释放的原因控制器。由于我不打算在这种方法中再使用它,我需要释放它。

此外,您已将new(我将其重命名为newObject)定义为NSString。核心数据对象始终是NSManagedObject的实例或NSManagedObject的子类。

您的第[categoryEl = [nodes objectAtIndex:i]]行无法编译。那是因为括号语法用于向对象发送消息。这是赋值语句,因此这里不需要括号语法。 (这条线也不再需要了,因为我已经改变了循环以使用for-each语法)但是,为了将来的参考,categoryEl = [nodes objectAtIndex:i];会有效。

答案 1 :(得分:1)

你遇到什么问题?它不应该比循环数组,为每个条目创建一个新的托管对象,以及设置正确的属性更多。您可以使用NSEntityDescription的-insertNewObjectForEntityForName:inManagedObjectContext:方法创建托管对象。