iPhone快速sqlite查询

问题描述:

我正在访问近30,000个单词并在表中显示。这些单词在一个sqlite文件中。所以需要很长时间(15秒)来运行查询并将该单词加载到表中。显然,该应用程序在启动时等待15秒。iPhone快速sqlite查询

我该如何解决这个问题?

NSLog(@"Query start"); 


    CFTimeInterval startTime = CFAbsoluteTimeGetCurrent(); 

FMResultSet *rs = [db executeQuery:@"select * from words order by no ASC "]; 
while ([rs next]) { 
    Word *word = [[Word alloc] initWithID:[rs intForColumn:@"id"] 
             no:[rs stringForColumn:@"no"] 
             en:[rs stringForColumn:@"en"]]; 
    [words addObject: word]; 
} 
[rs close]; 
[db close]; 

CFTimeInterval endTime = CFAbsoluteTimeGetCurrent(); 
float deltaTimeInSeconds = endTime - startTime; 
NSLog(@"Time spent for query: %f seconds", deltaTimeInSeconds); 

注:原始表格未排序。它是字典的单词列表,所以何时显示,它必须按字母顺序排列在表格视图中。这就是为什么,我需要加载所有的单词。后台线程可能是一个更好的主意,从sqlite中获取数据时填充数据。 sqlite是否支持这个?用回调方法提取数据。例如在sqlite查询中,对于获取的每1000条记录,我将更新我的表。我不太确定如何做到这一点,如果你知道PLZ给我一些提示。

+1

表索引? – 2010-11-02 12:28:00

+1

我不这么认为。这是一个sqlite语言表,用于在Java中创建的字典(数据输入在桌面上完成)。 – karim 2010-11-02 13:13:16

+1

索引提高了性能。但并不多。它将加载时间从15秒降低到6/7秒。 – karim 2011-04-02 18:34:38

使用LIMITOFFSET同时获取数据块。另外,让UITableView驱动读取过程。当它触发tableView:cellForRowAtIndexPath:并且所讨论的行不可用时,从SQLite中提取并缓存包含该行的行块。您也可以在后台获取后台线程或事件循环,以便在用户滚动表格时最小化延迟。

我建议两两件事:

首先:你需要在同一时间加载在内存中的所有对象30000?如果你不需要它,只要你需要它们就可以加载你要在表格中显示的对象。您可以在查询中使用limit子句来加载只需要显示的小部分数据。

第二:您可以尝试查看是否在no字段帮助下创建索引。尽管很大一部分时间很难提高性能,但iOS会花费创建Word对象并将它们放入words阵列中。

+0

plz请参阅注意: – karim 2010-11-02 13:18:00

+1

然后尝试在该列上创建索引。 – 2010-11-02 13:31:23

+1

我还关心创建的Word对象。我想过使用并行数组的字符串。但这会使分类和对象管理复杂化。 – karim 2010-11-02 22:48:21

您可能还想考虑切换到Core Data和NSFetchedResultsController,而不是直接使用Sqlite。

核心数据的一大优点就是它在缓存和延迟加载对象方面的优势。

Core Data vs Sqlite and performance

+0

使用核心日期时,sqlite字段会给出一些不友好的名称。而sqlite数据库是在其他地方使用java和其他sqlite浏览器工具创建的。所以我需要使用sqlite。 – karim 2010-11-02 13:19:27