代码之家  ›  专栏  ›  技术社区  ›  karim

iPhone快速sqlite查询

  •  1
  • karim  · 技术社区  · 14 年前

    我怎么能避开这个?

    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支持这个吗?使用回调方法获取数据。e、 在sqlite查询中,每提取1000条记录,我就更新我的表。我不太清楚怎么做,如果你知道请给我一些提示。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Marcelo Cantos    14 年前

    使用 LIMIT OFFSET 一次获取数据块。另外,让UITableView驱动获取过程。当它开火时 tableView:cellForRowAtIndexPath:

        2
  •  1
  •   Pablo Santa Cruz    14 年前

    我建议两件事:

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

    第二:您可以尝试在 no 现场帮助。虽然在很大一部分时间里它不太可能提高你的性能,但是iOS会花费 Word 把东西放进去 words

        3
  •  1
  •   Community CDub    8 年前

    您可能还想考虑切换到核心数据和NSFetchedResultsController,而不是直接使用Sqlite。

    Core Data vs Sqlite and performance