2013-06-23 74 views
1

我正在制作一个ios应用程序,它通过网络获取xml feed,解析并将其存储在sqlite数据库中,然后显示给用户。ios - 数据库存储时间需要很长时间

我的XML饲料是约1700线长:http://www.paulshin.ca/yunatube/res/en.xml

这是我的应用程序是如何工作的。

  1. 用户运行的应用程序
  2. 应用程序获取XML在网络上
  3. 使用XML解析器和遍历XML对象以及每个项目存储在sqlite的分贝
  4. 一旦完成,显示项tableview ..

但是,我发现步骤2需要少于5秒,而步骤3需要约20秒。原因是因为将每个项目存储到数据库需要一些时间。

以下是我使用步骤3.

TBXMLElement * elemRoot =零,*的YouTube =零,* maincateg =零,* CATEG =零,*夹=零;正如你所看到的,我有一些嵌套的循环,我通过调用addDataToTAble()将每个项存储到数据库中。如果我删除* (换句话说,如果我不在每个循环后存储项目)行,它的工作速度非常快。但是,如果我保留*这一行,它需要很长时间。

此功能如下:

-(void) addDataToTable: (NSString*)table 
      title: (NSString*)title 
       url:(NSString*)url 
      category:(NSString*)category 
{ 
    sqlite3_stmt *statement; 
    const char *dbpath = [_databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &_yunatubeDB) == SQLITE_OK) { 

     NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO %@ (TITLE, URL, CATEGORY) VALUES (\"%@\", \"%@\", \"%@\")", table, title, url, category]; 

     const char *insert_stmt = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(_yunatubeDB, insert_stmt, 
          -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) { 
      //   NSLog(@"Successfully added to DB"); 
     } else { 
      NSLog(@"Failed to add data to DB"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(_yunatubeDB); 
    } 
} 

好像这个函数存储每个项目时需要一段时间,而且由于存储时间的积累,它最终需要长达20秒。 我使用类似的算法为Android,它的工作速度很快,但我不知道为什么它需要如此长的IOS。我想知道这个处理时间是否会对应用商店中的应用评价产生负面影响。我在android上使用类似的方法,它的工作速度非常快,不到4秒。我不知道为什么ios需要这么长时间。难道我做错了什么 ?

任何帮助表示赞赏!

+0

您可以尝试将所有行插入到一个INSERT sratent中。 参见:http://stackoverflow.com/questions/1609637/is-it-possible-to-insert-multiple-rows-at-a-time-in-an-sqlite-database –

+0

打开分贝每次你插?如何在整个循环之前做一次这样的事情? –

回答

1

尝试在循环之前开始SQLite事务并在此之后结束。如果您没有手动启动/停止事务,SQLite将在每次写入时自动执行,这非常缓慢。

0

20秒钟可能会通过苹果审查,但永远不会让你的应用程序良好的评论。

你每次找到条目都要写db。你应该在解析结束时写入数据库。