IPhone编码:从XML文件接收数据并希望保存到SQLite

时间:2011-03-01 12:28:25

标签: iphone xml parsing sqlite

我正在尝试设置一个iPhone应用程序,它从互联网上提取XML文件,然后希望它保存到SQLite数据库。我用来解析XML文件的编码是:

SQLViewAppDelegate.m

NSURL *url = [[NSURL alloc] initWithString:@"http://www.180designlab.com/waxjambu/getupdates.xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
XMLParser *parser = [[XMLParser alloc] initXMLParser];
[xmlParser setDelegate:parser];
BOOL success = [xmlParser parse];
NSLog(@"Info array has %d items", [infoGet count]);
totalCount = [infoGet count];
//[self save_Clicked];

if(success)
  NSLog(@"No Errors");
else 
  NSLog(@"Error Error Error");

XMLParser.m

-(XMLParser *)initXMLParser
{

[super init];
appDelegate = (SQLViewAppDelegate *)[[UIApplication sharedApplication] delegate];

return self;
}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{


if ([elementName isEqualToString:@"Updates"]) 
{


appDelegate.infoGet = [[NSMutableArray alloc] init];


}


else if ([elementName isEqualToString:@"Update"])
{
            aInfo = [[XMLInfo alloc] init];
    aInfo.infoGetID = [[attributeDict objectForKey:@"id"] integerValue];

    //aGetInfo.info
    NSLog(@"Info ID Value: %i", aInfo.infoGetID);
}



NSLog(@"Processing Element: %@", elementName);

}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

 {



if(!currentElementValue)
    currentElementValue = [[NSMutableString alloc] initWithString:string];
  else 
    [currentElementValue appendString:string];
    //[self saveData];
    NSLog(@"Processing Value: %@", currentElementValue);
    NSLog(@"Processing ID: %d", aInfo.infoGetID);

}

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

 {

if ([elementName isEqualToString:@"Updates"])
    return;
    if ([elementName isEqualToString:@"Update"]) 

{


[appDelegate.infoGet addObject:aInfo];

        [aInfo release];
        aInfo = nil;


}

else
    [aInfo setValue:currentElementValue forKey:elementName];
    [currentElementValue release];
    currentElementValue = nil;

}

我可以将数据输入到tableView中,但无法解决如何将它们保存到我已经拥有的SQLite文件中。

我也可以从SQLite文件中将数据加载到tableView中。我现在还可以在两个文本字段中输入数据时使用AddView时添加到SQLite。什么我尝试它出现说内存不足。我知道这是一件简单的事情,但是不能正常或者解决这个问题。

希望有人能帮助我。

我很期待收到你的回复

1 个答案:

答案 0 :(得分:0)

关于你的记忆问题。你发布了所有物品吗?每当您键入 Alloc 复制时,您都要对该对象负责,并且必须在代码的某个阶段将其释放。

使用Core Data代替SQLite。 Core Data使用SQLite作为其后备存储,并以面向对象的方式存储数据。

创建项目时,您需要选择Core Data的复选框。

查询核心数据的过程如下:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"TABLENAME" inManagedObjectContext:context];
request.predicate = [NSPredicate predicateWithFormat:@"uniqueId = %@", [Data objectForKey:@"id"]];

NSError *error = nil;
NSManagedContext *returnedData = [[context executeFetchRequest:request error:&error] lastObject];
[request release];

按如下方式插入数据:

[NSEntityDescription insertNewObjectForEntityForName:@"TABLENAME" inManagedObjectContext:context];
    MODEL_OBJECT.uniqueId = [Data objectForKey:@"id"];
    MODEL_OBJECT.title = [Data objectForKey:@"title"];

举一个很好的例子,观看斯坦福大学开发的iOS iOS iTunes应用程序的讲座12(核心数据和表格视图)。

  • MODEL_OBJECT 将是您在创建NSManagedObjects时自动创建的NSManagedObject实体对象。

如果这不能回答您的问题,请道歉,但使用Core Data比使用iPhone的SQL更有效。