如何在Objective-C中提高此sqlite db查询/对象创建的速度?

时间:2010-02-14 03:03:35

标签: iphone sqlite nsmutablearray while-loop

我有以下方法查询iPhone上的 sqlite 数据库表 它从表中抽取大约6,000行,然后根据信息循环创建6,000个对象并将它们填充到数组中。

while 循环有点慢(在我的设备上需要大约10秒的时间来迭代它们) 有关如何加快速度的想法吗?

TKS !!!

NSMutableArray  *dees              = [[NSMutableArray alloc] init];

if(sqlite3_open([database_path UTF8String], &database) == SQLITE_OK) {
  const char      *sqlStatement = "select cn, gn, df, or, id from doits order by lower(cn)";
  sqlite3_stmt    *compiledStatement;
  if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

    //loop through the results and feed them into the array
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
        // Read the data from the result row
        NSString    *a_cn             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
        NSString    *a_gn             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
        NSString    *a_df             = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
        NSString    *an_or            = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
        NSString    *ident            = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];

        DL   *dl = [[DL alloc] init];
        dl.cn            = a_cn;
        dl.gn            = a_gn;
        dl.df            = a_df;
        dl.or            = an_or;
        dl.primary_id    = [ident intValue];
        [dees      addObject:dl];
    }
}
sqlite3_finalize(compiledStatement);

3 个答案:

答案 0 :(得分:2)

为什么要在运行时创建所有6K?懒惰加载它们并且只在需要时创建所需的项目怎么样?

iphone不是台式电脑,它的400 + CPU CPU和迭代6K的结果会很慢。

您的表格索引正确吗?你可以优化架构吗(字段类型?)?除了迭代6K元素之外,你真的没有做太多 - 所以我没有看到优化该循环的直接方法。

我看起来更大的图片并试图找到延迟加载或部分加载数据的方法。假设你使用数据来填充UITableView,也许你只需要第一层,而不是完全成熟的对象?

编辑:

字段类型的含义是数据库中有4x“sqlite3_column_text”文本字段。您是否必须使用文本字段,或者您是否可以使用更小且可能更适合您的数据?

答案 1 :(得分:0)

正如Mr-sk所说,出于内存和性能原因,一次加载所有6,000个元素是个坏主意。您将要批量提取,以便您只在任何给定时间在屏幕上加载元素。对于运行搜索,您需要对数据库执行查询。

如果您要将数据模型切换为使用Core Data,则在NSFetchRequest上使用NSFetchedResultsController和-setFetchBatchSize:此批量提取变得微不足道。只提供表视图所需的数据正是本课程的目的。对于搜索,您可以提供NSFetchRequest,根据搜索条件筛选结果。这将导致应用程序性能的大幅提升。

答案 2 :(得分:0)

将结果对象添加到数组后,是否可以释放它并查看性能是否会提高。

[dees addObject:dl];

[d1 release];

你正在做的是动态创建hte对象并添加到Array,但是一旦添加了对象,你实际上并没有释放它们。我猜这是内存泄漏。

由于

Suresh Kumar Narayanasamy