我不确定我是否正确理解了您的描述,但是根据您的描述,我认为您的“读取器”逐行遍历数据库,并且每次找到结果时都会回调到一个回调函数?这是正确的吗?
如果是这样,您可能会反复锁定您的数据库,而且搜索速度会很慢。
正确的方法是在一次查询中提取所有匹配项的结果集 - 一旦完成该查询,锁定将被释放,并且您将从SQL中获得仅包含匹配行的结果集。
您可以通过使用类型为“SELECT * FROM tablename WHERE columnX LIKE '%searchstring%'”(或类似的,具体取决于您的搜索条件)的查询让SQLite创建这样的结果集。
这将创建一个包含数据库中所有匹配项的结果集,然后释放数据库锁。然后,您可以遍历结果并创建对象,并将其放入连接到您的UI视图的NSArray中。
NSArray retval = [NSMutableArray array];
NSString *query = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ LIKE %@",
tableName, columnName, searchString];
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil)
== SQLITE_OK) {
while (sqlite3_step(statement) == SQLITE_ROW) {
char *nameChars = (char *) sqlite3_column_text(statement, 0);
NSString *name = [NSString stringWithUTF8String:nameChars];
SomeClass *info = [[SomeClass alloc] initWithName:name];
[retval addObject:info];
[info release];
}
sqlite3_finalize(statement);
} else {
NSLog(@"SQL-statement failed");
}
这样做的话,在必要时写入数据库就不应该有问题。只有在绝对必要的情况下才向数据库执行新查询,例如当您的搜索条件发生变化或数据库中的内容已更新时。
不要对未更改的数据库或具有未更改的搜索条件运行重复查询。
ExecuteReader
可以返回多行(与ExecuteQuery
的一行相比),因此在某些情况下可能需要更多的资源。 - poupou