加速核心数据获取

时间:2010-12-13 13:56:36

标签: iphone objective-c core-data ios nsfetchrequest

这是在iOS上。

我有一个包含大约35万个对象的核心数据库。对象(Product)有两个属性:“条形码”和“指定”。用户可以通过搜索“条形码”来搜索对象,并且应该返回“指定”。一切都很好,除了它很慢。我使用的代码是:

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

由于我只想获取一个对象,有没有办法加快速度?

如果我在启动时将每个对象加载到一个数组中,那么应用程序的启动速度非常慢,占用大量内存。

提前致谢!

编辑:我添加[fetch setFetchLimit:1];这加快了一点点。但是数据库中对象的速度越来越慢。

3 个答案:

答案 0 :(得分:7)

Barcode属性是否已编入索引?

答案 1 :(得分:4)

首先,正如@paulbailey所写,检查Barcode是否已编入索引。

但是,如果您有这么多条目,并且您的条目只有两个属性(条形码和名称),并且如果您只从条形码侧查询并返回指定方,则使用CoreData可能是一种过度杀伤。

CoreData为您提供了许多面向对象的设施,并且对磁盘具有持久性,但它当然会受到惩罚。

最好完全删除CoreData,并直接使用sqLite。有一个很好的轻量级Objective-C封装器称为FMDB,请参阅here

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

答案 2 :(得分:0)

对象所需的数据库越来越长的原因是,Core Data使用了一种相当沉闷的搜索算法,该算法只是将指针放在第一个对象上,将其值包含在searchitem中,将指针放在下一个,直到比较匹配。

您可以使用大量搜索算法,具体取决于您可以使用Quicksearch,Hashsearches,treesearch等数据库(排序/未排序列表,树结构等)。

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