0

我有一个方法可以读取 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];
4

2 回答 2

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. Core Data 对象始终NSManagedObjectNSManagedObject.

你的行[categoryEl = [nodes objectAtIndex:i]]不会编译。这是因为括号语法用于向对象发送消息。这是一个赋值语句,所以这里不需要括号语法。(这一行也不再需要,因为我已经将循环更改为使用 for-each 语法)但是,为了将来参考,categoryEl = [nodes objectAtIndex:i];它会起作用。

于 2009-06-01T14:28:20.143 回答
1

你有什么问题?除了循环遍历数组、为每个条目创建一个新的托管对象并设置正确的属性之外,它不应该有更多的东西。您可以使用 NSEntityDescription 的-insertNewObjectForEntityForName:inManagedObjectContext:方法创建托管对象。

于 2009-05-31T06:58:28.687 回答