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给我一些提示。
使用LIMIT
和OFFSET
同时获取数据块。另外,让UITableView驱动读取过程。当它触发tableView:cellForRowAtIndexPath:
并且所讨论的行不可用时,从SQLite中提取并缓存包含该行的行块。您也可以在后台获取后台线程或事件循环,以便在用户滚动表格时最小化延迟。
我建议两两件事:
首先:你需要在同一时间加载在内存中的所有对象30000?如果你不需要它,只要你需要它们就可以加载你要在表格中显示的对象。您可以在查询中使用limit
子句来加载只需要显示的小部分数据。
第二:您可以尝试查看是否在no
字段帮助下创建索引。尽管很大一部分时间很难提高性能,但iOS会花费创建Word
对象并将它们放入words
阵列中。
您可能还想考虑切换到Core Data和NSFetchedResultsController,而不是直接使用Sqlite。
核心数据的一大优点就是它在缓存和延迟加载对象方面的优势。
使用核心日期时,sqlite字段会给出一些不友好的名称。而sqlite数据库是在其他地方使用java和其他sqlite浏览器工具创建的。所以我需要使用sqlite。 – karim 2010-11-02 13:19:27
表索引? – 2010-11-02 12:28:00
我不这么认为。这是一个sqlite语言表,用于在Java中创建的字典(数据输入在桌面上完成)。 – karim 2010-11-02 13:13:16
索引提高了性能。但并不多。它将加载时间从15秒降低到6/7秒。 – karim 2011-04-02 18:34:38