ios - 数据库存储时间很长

时间:2013-06-23 06:30:49

标签: ios xml parsing

我正在创建一个ios应用程序,它通过网络获取xml feed,解析并将其存储在sqlite db中,然后显示给用户。

我的xml Feed长约1700行:http://www.paulshin.ca/yunatube/res/en.xml

这就是我的应用程序的工作方式。

  1. 用户运行应用
  2. app通过网络获取xml
  3. 使用xml解析器并遍历xml对象并将每个项目存储在sqlite db
  4. 完成后,在tableview中显示项目..
  5. 然而,我发现步骤2需要不到5秒,而步骤3需要大约20秒。原因是因为将每个项目存储到数据库中需要一些时间。

    以下是我在步骤3中使用的内容。

    TBXMLElement * elemRoot = nil,* youtube = nil,* maincateg = nil,* categ = nil,* clip = nil;

        // maincatg
        NSString *mcTitle = nil;
        // catge
        NSString *cTitle = nil;
        // clip
        NSString *title = nil, *url = nil, *note = nil;
    
        elemRoot = tbxml.rootXMLElement;
    
        if (elemRoot) {
            youtube = [TBXML childElementNamed:@"youtube" parentElement:elemRoot];
            maincateg = [TBXML childElementNamed:@"maincateg" parentElement:youtube];
    
            while (maincateg) {
                mcTitle = [TBXML valueOfAttributeNamed:@"type" forElement:maincateg];
    
                categ = [TBXML childElementNamed:@"category" parentElement:maincateg];
                while (categ) {
                    cTitle = [TBXML valueOfAttributeNamed:@"title" forElement:categ];
    
                    clip = [TBXML childElementNamed:@"clip" parentElement:categ];
                    while (clip) {
                        title = [TBXML valueOfAttributeNamed:@"title" forElement:clip];
                        url = [TBXML valueOfAttributeNamed:@"url" forElement:clip];
                        note = [TBXML valueOfAttributeNamed:@"note" forElement:clip];
    
                        //TODO
                        if (![note isEqualToString:@"0"]) {
                            // save pared data to persistent
    
                            title = [title stringByReplacingOccurrencesOfString:@"&"
                                                                     withString:@"&"];
                            cTitle = [cTitle stringByReplacingOccurrencesOfString:@"&"
                                                                     withString:@"&"];
    
                            DatabaseManager *database = [DatabaseManager getInstance];
                            **[database addDataToTable:mcTitle title:title url:url category:cTitle];**
                        }
                        clip = clip -> nextSibling;
                    }
                    categ = categ -> nextSibling;
                }
    
                maincateg = maincateg -> nextSibling;
            }
    

    如您所见,我有一些嵌套循环,我通过调用addDataToTAble()将每个项目存储到DB;如果我用* 删除该行(换句话说,如果我不在每个循环后存储项目),它的工作速度非常快。但是,如果我按原样保留* 这一行,则需要很长时间。

    此功能如下:

    -(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需要这么长时间。我做错了吗?

    感谢任何帮助!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

20秒可能会通过苹果审核,但绝不会让您的应用得到好评。

每次找到条目时都会写入db。您应该在解析结束时写入db。