这是在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];这加快了一点点。但是数据库中对象的速度越来越慢。
答案 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数据库,它有一些很好的框架和智能搜索算法。