Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.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
iOS联系人搜索应用程序_Ios_Objective C_Core Data_Full Text Search_Fts4 - Fatal编程技术网

iOS联系人搜索应用程序

iOS联系人搜索应用程序,ios,objective-c,core-data,full-text-search,fts4,Ios,Objective C,Core Data,Full Text Search,Fts4,我正在开发一个类似于iOS联系人应用程序的应用程序。 在我的应用程序中,列表中大约有20000个联系人。 我想在此应用程序中执行通用搜索。 我们在搜索字段中键入时,也应该进行搜索 ,搜索“John Australia”将显示联系人,其中John位于姓名字段,澳大利亚位于地址字段。 我使用了coredata,但它的性能非常差(我不知道可能是我使用了不正确的谓词,我使用了OR和and组合的谓词) 所以现在我转到sqlite FTS4数据库,使用FMDB搜索联系人。性能比核心数据好得多 以下是我对FT

我正在开发一个类似于iOS联系人应用程序的应用程序。 在我的应用程序中,列表中大约有20000个联系人。 我想在此应用程序中执行通用搜索。 我们在搜索字段中键入时,也应该进行搜索

,搜索“John Australia”将显示联系人,其中John位于姓名字段,澳大利亚位于地址字段。 我使用了coredata,但它的性能非常差(我不知道可能是我使用了不正确的谓词,我使用了OR和and组合的谓词)

所以现在我转到sqlite FTS4数据库,使用FMDB搜索联系人。性能比核心数据好得多

以下是我对FTS4所做的

已将所有联系人导入coredata文件(uniqID、姓名、年龄、电子邮件、公司、职务、地址、备注等)。 现在创建了一个具有uniqID、searchText和displayName的fts4虚拟表

create virtual table searchData using FTS4 (guid, searchText, displayName)
并将所有字段插入fts4表。 例如

uniqId  name age email               company    title  address             note     
12312 , John,32,johnsock@style.com , style Inc, CEO , Australia Street-4 , bla bla bla  
这是核心数据中的行,它被移动到FTS4表中,如下所示

  uniqID searchText               displayName
    12312 John                     John
    12312 johnsock@style.com       John
    12312 Style Inc                John
    12312 CEO                      John
    12312 Australia Street-4       John
    12312 bla bla bla              John
现在我正在这个sqlite fts 4表中执行搜索。 这是我对“John Australia”的SQL查询

如果我有3个单词,那么我将有3个选择查询。 我从这个查询中得到的输出工作得很好

从查询中获得结果后,我使用显示名称在tableview中填充

我有两个问题

1如果我有多个单词,与iOS本机联系人应用程序相比,我仍然面临性能问题

  • 如果我只搜索一个单词,性能非常好,但是 对多词搜索不满意

  • 我的查询不会用like搜索电子邮件id(这是我需要获得的) 即使我使用工作“sock”进行搜索也会得到结果

  • 是否有任何算法或逻辑,我可以在这个搜索中应用,这样我的搜索就快了(请考虑多词搜索)。 同时,我如何才能搜索电子邮件id与喜欢的查询保持相同的更好的性能

    参考:


    我们在项目中遇到了类似的性能问题,sqlite中的pragma命令帮助了我们。您可以使用以下命令进行性能升级

  • 更改缓存大小(每页1024字节)

    PRAGMA cache_size=页数

  • 更改同步写入行为

    “PRAGMA synchronous=OFF”

  • 将临时存储更改为内存

    “PRAGMA temp_store=内存”

  • 大多数这些命令都是针对每个会话的,因此您可能必须在每次连接后执行它们。在实现此功能之前,您可能还需要阅读文档,因为这些命令会以一定的成本提高性能。这些pragma命令都有文档记录

    SELECT guid,displayName FROM searchData WHERE searchText MATCH John* INTERSECT SELECT guid,displayName FROM searchData WHERE searchText MATCH Australia*