NSArray 到核心数据项

Posted

技术标签:

【中文标题】NSArray 到核心数据项【英文标题】:NSArray to Core Data items 【发布时间】:2009-05-31 06:27:03 【问题描述】:

我有一个读取 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];

【问题讨论】:

【参考方案1】:

我是这样写的:

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 对象要么是NSManagedObject 的实例,要么是NSManagedObject 的子类。

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

【讨论】:

【参考方案2】:

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

【讨论】:

在我的测试中,我删除了核心数据,以便我可以学习循环遍历数组。我已经用新的数组代码更新了我的问题,但它不起作用。遍历数组并将其添加到实体的最佳方法是什么?

以上是关于NSArray 到核心数据项的主要内容,如果未能解决你的问题,请参考以下文章

带有 NSNumber 的 NSArray 的 NSPredicate(核心数据)

保存到核心数据“ALL 或 ANY 运算符的左侧必须是 NSArray 或 NSSet

核心数据可转换属性(NSArray)为空

如何在核心数据中保存NSArray数据?

使用 NSArray 从 iOS 上的可转换核心数据创建对象

NSArray 作为核心数据 fetchRequest 中的参数