2011-05-10 107 views
0

我在CoreData中的表有8列,都是字符串。最大的字符串长度小于10K。iphone核心数据 - 为什么核心数据如此之慢?

首先,我用下面的代码来检索行:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Item" inManagedObjectContext:context]]; 
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(URL ==[c] %@)", url]]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Time" ascending:NO selector:nil]; 
NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 
[fetchRequest setSortDescriptors:descriptors]; 
[sortDescriptor release]; 

NSError *error = nil; 
NSArray *array = [context executeFetchRequest:fetchRequest error:&error]; 

这里是性能日志:

2011-05-10 11:47:18.743的Test2 [2176:5907 CoreData:注释:sql连接获取时间:2.6172s

2011-05-10 11:47:21.600测试2 [2176:5907] CoreData:注释:对于144行,总提取执行时间:2.8577s。

144行超过2秒?

然后我构建用于每一行的非coredata对象:

的性能日志(我认为对于一个行读取)用于上述代码
if ([array count] > 0) { 
    for (Item *item in array) { 
     SimpleItem *sitem = [[SimpleItem alloc] init]; 
     sitem.Title = item.Title; 
     sitem.Summary = item.Summary; 
     sitem.URL = item.URL; 
     [dataDict setObject:sitem forKey:item.URL]; 
     [sitem release]; 
    } 
    [dataDict release]; 
} 

部分是:

2011 -05-10 11:47:21.617 Test2 [2176:5907] CoreData:sql:SELECT 0,t0.Z_PK,t0.Z_OPT,t0.ZURL,t0.ZSUMMARY,t0.ZIMAGEURL,t0.ZTITLE,t0.ZURL ,t0.ZTIME FROM ZITEM t0 WHERE t0.Z_PK =?

2011-05-10 11:47:21.629的Test2 [2176:5907] CoreData:注释:SQL连接提取时间:0.0098s

2011-05-10 11:47:21.633的Test2 [2176:5907 ] CoreData:注释:总提取执行时间:1行0.0162s。

看起来有毛病。

任何人都可以帮助我提高性能?

另外,我在编辑xcode中的数据模型时检查了URL的“Index”选项。这足以建立索引吗?

+2

需要更多的细节提供任何有用的答案。 – 2011-05-10 10:52:18

+0

@Denis,是的,我更新了我的问题 – Jack 2011-05-10 11:45:13

回答

0

这听起来像你没有在你的列上使用任何索引,这可能有助于加快速度,但如果你正在搜索字符串10K的长度,CoreData可能不是要走的路。

而CoreData不是数据库 - 它使用sqlite处理一些效率较低的问题。在CoreData中,对象被完全加载到内存中进行一些操作 - 将10K * 144记录加载到内存中可能不会成为世界上最快的事情:)

尝试在sqlite中编写数据库代码并查看它是否更快。

+0

你好。我认为在我的情况下,CoreData没有将144行内容一次加载到内存中。相反,只有当我读取一行的每个属性时,内容才会被加载到内存中。我用完整的日志更新我的问题。顺便说一下,如何设置索引?谢谢 – Jack 2011-05-10 11:36:02

+0

如果您选择一个属性(本例中为URL),则应在XCode的属性检查器视图中标记为“已编制索引”的复选框。 – deanWombourne 2011-05-10 11:48:30

+0

你也可以看看http://developer.apple。com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html - NSFetchedResultsController将分批获得结果,而不是一次获得所有结果。 – deanWombourne 2011-05-10 11:49:25