Iphone 用于存储20000个UISearchBar查询项目的最佳数据存储

Iphone 用于存储20000个UISearchBar查询项目的最佳数据存储,iphone,objective-c,Iphone,Objective C,我需要存储20000条简短的记录(将标识符映射到名称),并允许用户在UISearchBar中按ID或名称搜索一条记录 方法1(核心数据):为了节省内存,我尝试使用以SQLite为后端的CoreData实现这一点,但发现在完成初始导入时,存储20000条记录的速度很慢。然后,当用户逐字在UISearchViewBar中输入时,响应速度也明显变慢 方法2(NSMutableArray):当我使用NSMutableArray在内存中实现相同的东西时,UISearchBar上的响应时间非常快 在第一种方

我需要存储20000条简短的记录(将标识符映射到名称),并允许用户在UISearchBar中按ID或名称搜索一条记录

方法1(核心数据):为了节省内存,我尝试使用以SQLite为后端的CoreData实现这一点,但发现在完成初始导入时,存储20000条记录的速度很慢。然后,当用户逐字在UISearchViewBar中输入时,响应速度也明显变慢

方法2(NSMutableArray):当我使用NSMutableArray在内存中实现相同的东西时,UISearchBar上的响应时间非常快

在第一种方法中,一次只有一小部分记录在内存中,但响应时间很慢。在第二种方法中,20000个条目只占用700KB(低于MB)的内存,响应时间很快

由于核心数据提供了持久性存储,并使得使用谓词进行查询非常灵活,如果可能的话,我想使用。有没有人对是否有办法继续使用Coredata但获得更快的结果提出建议


谢谢

在CoreData上执行击键查询不是一个好主意

CoreData并不是要反复遭受如此沉重的打击。您必须记住实际运行此数据库的设备。将CoreData放在一个有10年历史的桌面上,看看它运行得有多快

另外,我非常确定有一种方法可以将NSPredicate与NSArray一起使用。。。没有你的链接,但我想我以前见过

当然,最初导入CoreData的速度非常慢。IIRC,每个CoreData记录创建2个单独的查询


如果您想降低内存消耗,只需调用对象中所需的内容进行搜索,然后在实际需要时拉动整个对象。

为什么不同时执行这两项操作?使用核心数据进行持久化。将managedObjectID和属性预取到内存缓存中,以便使用搜索栏进行搜索。选择项目后,可以使用managedObjectID从MOC获取实体


使用NSArray的
FilteredarrayingPredicate:
和NSMuatableArray的
FilteringPredicate

谢谢您的意见。我对NSArray不感兴趣——只对核心数据获取感兴趣。:)我知道。但我是说你可以,因为这不是一种很好的搜索方式。对不起,谢谢…我目前正在做一个for循环,并在ID上进行字符串匹配--还想在数组上进行字符串匹配。for循环可能效率不高,所以我将看看是否可以以某种方式对数组进行预排序,并做一些更聪明的事情。非常好的主意。我不知道你可以在NSMutableArray上执行过滤…谢谢你谢谢。昨天我试着使用FilteredarrayingPredicate。不幸的是,因为它是一个包含20000个元素的大数组,所以每次击键的执行速度有点慢。是否有一种方法可以使用NSDictionary而不是数组来搜索接近匹配的键。这可能比遍历数组快得多,因为键是按键名索引的。数组排序了吗?使用可变的
fiterArrayUsingPredicate
。这将导致每个后续搜索使用较小的集合。另一种方法是“非规范化”核心数据中的数据,并为每个字符设置列。无法搜索字典键以查找部分匹配项。