Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CoreData和NSXMLParser_Objective C_Cocoa Touch_Core Data_Nsxmlparser_Nsmanagedobject - Fatal编程技术网

Objective c CoreData和NSXMLParser

Objective c CoreData和NSXMLParser,objective-c,cocoa-touch,core-data,nsxmlparser,nsmanagedobject,Objective C,Cocoa Touch,Core Data,Nsxmlparser,Nsmanagedobject,嗨,朋友们 从NSURLConnection获取数据后,我正在使用NSXMLParser解析网络的XML文件。 XML有许多“项”,每个项包含一个类别。 在CoreData模块中,我有一个与一个类别相关的项目实体 解析XML文件并点击消息解析器时:didStartElement:。。。使用“Item”元素,我为Item创建一个NSEntityDescription。然后解析器再次到达消息解析器中的类别项:didStartElement:。。。我为类别创建了一个NSEntityDescriptio

嗨,朋友们

从NSURLConnection获取数据后,我正在使用NSXMLParser解析网络的XML文件。 XML有许多“项”,每个项包含一个类别。 在CoreData模块中,我有一个与一个类别相关的项目实体

解析XML文件并点击消息解析器时:didStartElement:。。。使用“Item”元素,我为Item创建一个NSEntityDescription。然后解析器再次到达消息解析器中的类别项:didStartElement:。。。我为类别创建了一个NSEntityDescription

XML:

<item>

<title>Plates</title>

<category>Kitchen</category>

<price>14</price>

<picture></picture>

因此,当CurrentItem尚未完成创建时,会首先为currentCategory调用context save:call。

在解析整个XML文件并插入所有需要插入的对象之前,不需要保存上下文。删除解析例程中的
-save:
调用,并在解析操作完成时调用它。

在解析整个XML文件并插入所有需要插入的对象之前,无需保存上下文。删除解析例程中的
-save:
调用,并在解析操作完成时调用它。

您似乎保存得太频繁了。虽然等待XML文件结束保存可能不是一个好主意,但您可能希望等待完成一个“实体”


但是,我建议您也研究一种不同的解析器。TouchXML可能对您更有用,因为它的级别没有这样低,并且可以使导入过程的概念化变得更容易。

您似乎保存得太频繁了。虽然等待XML文件结束保存可能不是一个好主意,但您可能希望等待完成一个“实体”


但是,我建议您也研究一种不同的解析器。TouchXML可能对您更有用,因为它的级别没有此级别低,并且可以使导入过程的概念化更容易。

这是一个很好的技巧,我将在每个实体之后保存。我不知道我最终能拯救一切,但这似乎更安全。关于TouchXML,我将看一看我已经下载了它,但我只是从XML中阅读,所以似乎NSXMLParser就足以完成这项任务。谢谢这是一个很好的提示,我会在每次实体后保存。我不知道我最终能拯救一切,但这似乎更安全。关于TouchXML,我将看一看我已经下载了它,但我只是从XML中阅读,所以似乎NSXMLParser就足以完成这项任务。谢谢这是个好主意,我将只在每个项目循环结束时保存,这将给我一个完整的数据循环。感谢您的回复这是个好主意,我将只在每个项目循环结束时保存,这将给我一个完整的数据循环。谢谢你的回复
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {


//Started reading an Item Element, init currentItemObject
if ([elementName isEqualToString:@"Item"]) {
    [self.currStringFound setString:@""];
    currentItemObject  = (Item *)[NSEntityDescription insertNewObjectForEntityForName:@"Item" inManagedObjectContext:[self managedObjectContext]];
    return;
}

//Started Title element
if ([elementName isEqualToString:kTitleElementName]) {
    [self.currStringFound setString:@""];
}

//Started Category element
if ([elementName isEqualToString:kCategoryElementName]) {
    currentCategory  = (Category *)[NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:[self managedObjectContext]];
    [self.currStringFound setString:@""];
}
}



- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

if ([elementName isEqualToString:kItemElementName]) {
    //save the item to CoreData
    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"could not save Item");
        exit(1);
    }
    return;
}

//Started Category element
if ([elementName isEqualToString:kCategoryElementName]) {
    currentCategory.title = self.currStringFound;
    NSLog(@"Category = %@",self.currStringFound);
    NSManagedObjectContext *context = [self managedObjectContext];
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"could not save Item");
        exit(1);
    }
    return;
}}