【问题标题】:iPhone quick sqlite queryiPhone快速sqlite查询
【发布时间】:2011-05-03 21:56:05
【问题描述】:

我正在访问近 30,000 个单词并显示在一个表格中。单词在 sqlite 文件中。因此,运行查询并将单词加载到表中需要很长时间(15 秒)。显然应用程序在启动时会等待 15 秒。

我怎样才能解决这个问题?

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 条记录,我将更新我的表。我不太清楚该怎么做,如果你知道请给我一些提示。

【问题讨论】:

  • 我不这么认为。这是一个 SQLite 单词表,用于在 Java 中创建的字典(数据输入在桌面完成)。
  • 索引提高了性能。但并不多。它将加载时间从 15 秒降低到 6/7 秒。

标签: iphone sqlite


【解决方案1】:

使用LIMITOFFSET 一次获取数据块。此外,让 UITableView 驱动获取过程。当它触发tableView:cellForRowAtIndexPath: 并且相关行不可用时,从 SQLite 获取并缓存包含该行的行块。您还可以使用后台线程或事件循环在后台获取块,以最大限度地减少用户滚动表格时的延迟。

【讨论】:

    【解决方案2】:

    我建议两件事:

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

    第二:您可以尝试查看在no 字段上创建索引是否有帮助。尽管大部分时间它不太可能提高你的性能,但 iOS 将花费创建 Word 对象并将它们放入 words 数组中。

    【讨论】:

    • 然后尝试在该列上创建索引。
    • 我还关心创建的 Word 对象。我想使用并行的字符串数组。但这会使排序和对象管理复杂化。
    【解决方案3】:

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

    Core Data 的一大好处是它在缓存和延迟加载对象方面为您提供了。

    Core Data vs Sqlite and performance

    【讨论】:

    • 使用核心日期时,sqlite 字段被赋予了一些不友好的名称。 sqlite DB 是使用 java 和其他 sqlite 浏览器工具在其他地方创建的。所以我需要使用 sqlite。
    猜你喜欢
    • 2011-10-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2012-10-28
    • 1970-01-01
    相关资源
    最近更新 更多