我有以下方法查询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);
答案 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