【问题标题】:How to save core data with an xml parser如何使用 xml 解析器保存核心数据
【发布时间】:2012-02-03 16:51:17
【问题描述】:

我做了这个 xml 解析器:

XMLToObjectParser.m:

#import "XMLToObjectParser.h"

@implementation XMLToObjectParser

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

- (NSArray *)items
{
    return items;
}

- (id)parseXMLAtURL:(NSURL *)url
           toObject:(NSString *)aClassName
         parseError:(NSError **)error
{
    //[items release];
    items = [[NSMutableArray alloc] init];
    className = aClassName;
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [parser setDelegate:self];
    [parser parse];

    if([parser parserError] && error) {
        *error = [parser parserError];
    }
    //[parser release];
    return self;
}

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
    attributes:(NSDictionary *)attributeDict
{
    if([elementName isEqualToString:className]) {
        // create an instance of a class on run-time
        item = [NSEntityDescription entityForName:className inManagedObjectContext:managedObjectContext];
    }
    else {
        currentNodeName = [elementName copy];
        currentNodeContent = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser
 didEndElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qName
{
    //NSLog(@"Close tag: %@", elementName);
    if([elementName isEqualToString:className]) {
        [items addObject:item];
        //[item release];
        item = nil;
    }
    else if([elementName isEqualToString:currentNodeName]) {
        // use key-value coding
        [item setValue:currentNodeContent forKey:elementName];

        //[currentNodeContent release];
        currentNodeContent = nil;

        //[currentNodeName release];
        currentNodeName = nil;
    }
}

- (void)parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
    [currentNodeContent appendString:string];
}

- (void)dealloc
{
    //[items release];
    //[super dealloc];
}

@end

XMLToObjectParser.h:

#import <Foundation/Foundation.h>

@interface XMLToObjectParser : NSObject <NSXMLParserDelegate> {
    NSString *className;
    NSMutableArray *items;
    NSObject *item; // stands for any class
    NSString *currentNodeName;
    NSMutableString *currentNodeContent;
    NSManagedObjectContext *managedObjectContext;
}

- (NSArray *)items;
- (id)parseXMLAtURL:(NSURL *)url
           toObject:(NSString *)aClassName
         parseError:(NSError **)error;

@end

它正在解析这样的 xml:

<section id="2">
  <label>Animaux</label>
  <image>Images/Rayons/Bandeau/Animaux.png</image>
  <key>Images/Rayons/Bandeau/Animaux.png</key>
  <products>
     <Product id="21">
        <category_id>Chat</category_id>
        <label>Aliments pour chat</label>
        <price>2.00</price>
     </Product>
     <Product id="1286">
        <category_id>Chat</category_id>
        <label>Boite de paté</label>
        <price>0.00</price>
     </Product>
  </products>
</sections>

但是上线就崩溃了

 item = [NSEntityDescription entityForName:className inManagedObjectContext:managedObjectContext];

谁能帮帮我?

谢谢

【问题讨论】:

    标签: objective-c core-data xml-parsing


    【解决方案1】:

    我没有阅读所有发布的代码,但我认为您正在寻找这种方法:

    [NSEntityDescription insertNewObjectForEntityForName:name
                         inManagedObjectContext:ctx];
    

    +entityForName: 仅获取实体描述(NSEntityDescription 类型),但您正在尝试创建一个对象。

    【讨论】:

    • 是的,但是如何从我的 xmlParser 类中获取 ctx?抱歉,我从目标 C 开始。
    • NSManagedObjectContext 分配在代码的什么位置?
    • 我把它放在我的 Parser.h 中,事实是我创建了一个没有核心数据的项目,我可能忘记了一些东西。
    • 哎哟..随便新建一个项目,省去很多麻烦,尤其是刚开始的时候...
    • 你好,我试过了,但我仍然有一个错误:由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+entityForName:找不到实体名称'Section'的NSManagedObjectModel'跨度>
    猜你喜欢
    • 2013-06-06
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多