加快核心数据获取
Posted
技术标签:
【中文标题】加快核心数据获取【英文标题】:Speed up Core Data fetching 【发布时间】:2010-12-13 13:56:36 【问题描述】:这是在 ios 上。
我有一个包含大约 350 000 个对象的核心数据库。对象(产品)有两个属性:“条形码”和“名称”。用户可以通过搜索“Barcode”来搜索对象,应该返回“Designation”。一切正常,只是速度很慢。我使用的代码是:
NSEntityDescription *_product = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext];
NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
[fetch setEntity:_product];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"Barcode == %@",theBarcode]];
NSError *error = nil;
NSArray *results = [importContext executeFetchRequest:fetch error:&error];
NSManagedObject *object = [results objectAtIndex:0];
既然我只想获取一个对象,有没有办法加快速度?
如果我在启动时将每个对象加载到一个数组中,我的应用程序启动速度会非常慢,并且会占用大量 RAM。
提前致谢!
编辑:我添加了 [fetch setFetchLimit:1];这加快了一点。但是对象在数据库中越往下,速度就越慢。
【问题讨论】:
只是想问一下(也许会有所帮助)为什么每次启动时都将所有数据加载到数组中? 我不这样做。但是我说过,如果我这样做,那么我的启动速度会很慢:) 【参考方案1】:Barcode
属性是否已编入索引?
【讨论】:
谢谢!这很好地解决了我的问题!我实际上正在考虑在周五下班回家的路上建立索引,但那是周末,我完全忘记了它:)再次感谢!【参考方案2】:首先,正如@paulbailey 所写,检查Barcode
是否被索引。
但是,如果您有这么多条目,并且您的条目只有两个属性(条形码和名称),并且您只从条形码一侧查询并返回名称一侧,那么使用 CoreData 可能会有点矫枉过正。
CoreData 为您提供了许多面向对象的工具,并具有磁盘持久性,但它当然会带来一些损失。
完全放弃 CoreData 并直接使用 sqLite
可能会更好。有一个很好的轻量级 Objective-C 包装器,称为 FMDB,请参阅here。
如果你想坚持使用 CoreData,让事情变得更好的一种方法是在后台线程中获取并在主线程中显示结果,如 this Apple document 中所述。这样,在搜索数据库时 UI 不会冻结。
【讨论】:
是的,实际上我使用 FMDB 开始了这个项目,但最终改用了 Core Data。我这样做是因为将来该应用可能会提供一些其他信息。 和索引工作正如@paulbailey 所说。那挺好的!我经常忘记自己索引 CoreData 属性:p【参考方案3】:对象在数据库中越往后越需要越长的原因是,Core Data 使用了一种相当枯燥的搜索算法,它只是放置一个指向第一个对象的指针,理解它对搜索项的值,然后将指针放置到下一个等一个,直到比较匹配。
您可以使用大量搜索算法,具体取决于您的数据库(排序/未排序列表、树结构等),您可以使用快速搜索、哈希搜索、树搜索等。
你也可以考虑建立一个 SQlite 数据库,它有一些很好的框架和智能搜索算法。
【讨论】:
以上是关于加快核心数据获取的主要内容,如果未能解决你的问题,请参考以下文章
在 tabBar didSelectItem 上加载核心数据的替代方法?还是加快速度?