3

这是在 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]; 这加快了一点。但是对象在数据库中越往下,速度就越慢。

4

3 回答 3

7

属性是否被Barcode索引?

于 2010-12-13T14:29:26.890 回答
4

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

但是,如果您有这么多条目,并且您的条目只有两个属性(条形码和名称),并且您只从条形码一侧查询并返回名称一侧,那么使用 CoreData 可能是一种矫枉过正。

CoreData 为您提供了许多具有磁盘持久性的面向对象的工具,但它当然要付出代价。

完全放弃 CoreData 并直接使用可能会更好sqLite。为此,有一个名为 FMDB 的轻量级 Objective-C 包装器,请参见此处

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

于 2010-12-13T14:35:55.953 回答
1

对象在数据库中越往下越慢,原因在于 Core Data 使用了一种相当枯燥的搜索算法,它只是放置一个指向第一个对象的指针,理解它对搜索项的值,将指针放置到下一个对象,然后所以直到比较匹配。

您可以使用大量搜索算法,具体取决于您的数据库(排序/未排序列表、树结构等),您可以使用快速搜索、哈希搜索、树搜索等。

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

于 2010-12-13T14:39:48.360 回答