2010-12-13 63 views
3

这是iOS版本。加速核心数据提取

我有一个大约有350 000个对象的核心数据库。对象(产品)具有两个属性:“条形码”和“名称”。用户可以通过搜索“条形码”搜索对象,并返回“指定”。一切工作正常,除非它很慢。我使用的代码是:

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]; 

因为我只希望获取一个对象,是有办法加快步伐?

如果我在启动时将每个对象加载到一个Array中,我会得到一个非常缓慢的应用程序启动并占用大量内存。

在此先感谢!编辑:我添加了[fetch setFetchLimit:1];这加快了一点点。但是,数据库中的对象所处的速度越来越慢。

+0

只想问一下(可能会有帮助)为什么在每次启动时将所有数据加载到数组? – shannoga 2010-12-13 15:54:02

+0

我不这样做。但我说,如果我这样做,那么我会有一个缓慢的启动:) – Mikael 2010-12-13 16:22:17

回答

7

索引Barcode属性?

+0

谢谢!这解决了我的问题真的很好!我实际上正考虑在星期五下班回家的路上索引,但那是周末,我完全忘了它:)再次感谢! – Mikael 2010-12-13 14:42:32

4

首先,@paulbailey写道,检查是否索引Barcode。但是,如果你有很多条目,并且如果你的条目只有两个属性(条形码和名称),并且只从条形码侧进行查询并返回指定端,那么使用CoreData可能是一种矫枉过正。

CoreData为您提供了很多面向对象的持久化磁盘设备,但它当然会带来惩罚。

您可能会更好地放弃CoreData,并直接使用sqLite。有一个很好的称为FMDB的轻量级Objective-C包装器,请参阅here

如果你想坚持CoreData,让事情变得更好的一种方法是获取后台线程并在主线程中显示结果,如this Apple document中所述。这样,在搜索数据库时UI不会冻结。

+0

是的,实际上我是通过使用FMDB开始项目的,但最终使用了Core Data。我这样做是因为将来可能会有一些额外的信息给应用程序。 – Mikael 2010-12-13 14:43:44

+0

和索引作为@paulbailey说。那很好!我经常忘记自己编写CoreData属性:p – Yuji 2010-12-13 14:46:55

0

Core Data使用一种非常枯燥的搜索算法,它只需将指针指向第一个对象,将其值指向searchitem,将指针指向下一个等等,直到比较匹配。

有很多搜索算法可以使用,取决于你的数据库(排序/不排序列表,树结构等),你可以使用Quicksearch,Hashsearches,treesearch等。

你也可以考虑设置一个SQlite数据库,它有一些很好的智能搜索算法框架。