cocoa - NSArray 到核心数据项

标签 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];

最佳答案

这是我的写法:

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< 的原因 将其添加到阵列 Controller 后。由于我不会再在此方法中使用它,因此我需要释放它。

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

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

关于cocoa - NSArray 到核心数据项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/931466/

相关文章:

cocoa - Swift 和 Core Data 错误 : fatal error: use of unimplemented initializer 'init(entity:insertIntoManagedObjectContext:)'

ios - 跨多个上下文重用 NSFetchRequest 时崩溃

ios - CFMutableArray 超出其容量

ios - 字典数组还是带数组的字典?

ios - 如何使NSSortDescriptor用于数组工作?

objective-c - 实现后台 worker - Obj C/Cocoa

objective-c - 核心数据 : Using a temporary property for progress?

xcode - 这个 Cocoa 窗口是如何构建的?

iphone - 核心数据跨存储关系与获取的属性

macos - _blocksActionWhenModal Cocoa 私有(private)方法的替代品?