Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone Sqlite+80K行+LIKE=键盘滞后_Iphone_Sqlite_Keyboard_Performance_Sql Like - Fatal编程技术网

Iphone Sqlite+80K行+LIKE=键盘滞后

Iphone Sqlite+80K行+LIKE=键盘滞后,iphone,sqlite,keyboard,performance,sql-like,Iphone,Sqlite,Keyboard,Performance,Sql Like,我有一个一直拖延解决的问题,但现在是时候了 我有一个基本的字典程序。它有一个UISearchBar和一个UITableView。它的工作方式应该是,除非在设备上运行时会导致键盘延迟。模拟器很好,当然我有两种类型的搜索。当您输入和返回时。我发现两者返回结果所需的时间大致相同,但输入时的时间会使键盘滞后 我有一个UISearchBar textDidChange,它接受searchText并将其发送给一个搜索方法,该方法执行所有sqlite提升,将结果放入一个数组中。用户重新加载表格 - (void

我有一个一直拖延解决的问题,但现在是时候了

我有一个基本的字典程序。它有一个UISearchBar和一个UITableView。它的工作方式应该是,除非在设备上运行时会导致键盘延迟。模拟器很好,当然我有两种类型的搜索。当您输入和返回时。我发现两者返回结果所需的时间大致相同,但输入时的时间会使键盘滞后

我有一个UISearchBar textDidChange,它接受searchText并将其发送给一个搜索方法,该方法执行所有sqlite提升,将结果放入一个数组中。用户重新加载表格

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    if((searchType == SEARCH_AS_YOU_TYPE) && ([searchText length] >= 2)){
        NSString *myKeyword = [NSString stringWithFormat:@"%@", searchText];
        [self search:myKeyword];
        [myTableView reloadData];
    }
}
我把结果限制在50。我的SQL查询使用了类似的And和OR,目前还没有解决这个问题的方法

SELECT WORD_ID, DEFIN, PINYIN, SIMP, TRAD from WORDS where DEFIN LIKE "%to dog %" OR DEFIN LIKE "%dog" OR DEFIN LIKE "%dog%"  ORDER BY DEFIN LIMIT 50
我还尝试将[myTableView reloadData]移动到搜索方法中,希望键盘至少不会滞后。没有快乐。不幸的是,我知道sqlite基本上是在检查每一行,当它使用like操作符时。但是80排的3-4秒似乎有点慢


如有任何想法、想法、意见或建议,将不胜感激

我猜SQLite是如何执行该查询的:

查找与您的LIKE语句之一匹配的所有行

按定义分类

截断前50行之后的结果


我怀疑真正痛苦的部分是那种;如果不这样做,它只需收集找到的前50个匹配行。你能不把这些定义分类吗?

我觉得你在同一个线程中搜索并准备好键盘。这样,您将搜索尽可能多的字符,并且键入速度仅限于搜索速度

正确的解决方案是将其分为两个线程,一个用于读取和显示键盘,另一个用于搜索和显示搜索结果。这样,如果您键入的速度比搜索速度快,则只有搜索会滞后,而不是键入。例如,Firefox地址栏就是这样工作的


由于这两个线程以及它们之间的通信/协调,您的代码将更加复杂,但我认为这是唯一好的解决方案。

尝试在不同的线程中进行搜索查询。由于UI操作仅在主线程上执行,因此在主线程上执行的任何耗时操作都会延迟UI操作。

因为您使用的是LIKE sqlite,因此不会使用索引,它将从开始到结果集中达到50条记录的限制为止顺序扫描。根据数据的顺序,在最坏的情况下,它可能在开始或结束时达到前50个结果

你可以创建一个新的列来存储defin ie d中每个基本单词的第一个字母,然后为这个列编制索引

修改查询以从单词中选择*,其中firstletter=:firstletter order by defin limit 50

这将大大减少您的搜索空间

将使用like运算符进行完全匹配

您也可以对数据进行预排序,这样就不需要order by,我怀疑order by将导致扫描整个表,而不是在命中我通常使用的前50条记录时终止

[self performSelectorInBackground:@selector(threadedFetch) withObject:nil];
结合Core Data的NSFetchedResultsController,在用户搜索输入时启动提取。但在踩踏时要小心。为每个线程使用单独的NSManagedObjectContext,或使用-[NSManagedObjectContext lock]锁定单个上下文