2013-06-23 181 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。你應該在解析結束時寫入數據庫。