iphone核心数据 - 为什么核心数据如此之慢?

时间:2011-05-10 10:50:50

标签: iphone core-data

我在CoreData中的表有8列,都是字符串。最大字符串的长度小于10K。

首先,我使用以下代码检索行:

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 Test2 [2176:5907] CoreData:注释:总获取执行时间:144行的2.8577秒。

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来自ZITEM t0,其中t0.Z_PK =?

     

2011-05-10 11:47:21.629 Test2 [2176:5907] CoreData:annotation:sql connection fetch time:0.0098s

     

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

似乎存在缺陷。

任何人都可以帮助我改善表现吗?

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

1 个答案:

答案 0 :(得分:0)

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

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

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