核心数据获取不一致

时间:2012-06-23 14:23:28

标签: iphone objective-c ios cocoa-touch core-data

我正在使用一个非常小的示例项目downloaded from here。我正在尝试做的是调试为什么在我自己的项目中提取这么长时间,但我已经将这个项目用作一种基准。我在我的方案中启用了-com.apple.CoreData.SQLDebug 1,因此我可以看到哪些命令通过我的提取发送到SQLite存储。

首先,在AppDelegate中,我只是在for循环中包装第一部分(正在创建存储区)以创建1000个对象。他们注释掉AppDelegate的获取请求。

然后,在FBCFMasterViewController中,有一个获取请求。在保存1000个项目后运行应用程序并将它们提取到NSFetchedResultsController时,您将看到数千个与此类似的输出行:

2012-06-23 09:16:30.374 FailedBankCD[90166:fb03] CoreData: annotation: sql connection fetch time: 0.0004s
2012-06-23 09:16:30.375 FailedBankCD[90166:fb03] CoreData: annotation: total fetch execution time: 0.0009s for 1 rows.
2012-06-23 09:16:30.375 FailedBankCD[90166:fb03] CoreData: annotation: fault fulfilled from database for : 0xc3e9060 <x-coredata://60E5B64A-83AB-4E6A-BEAD-5FFF50DB7F66/FailedBankDetails/p823>
2012-06-23 09:16:30.376 FailedBankCD[90166:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCLOSEDATE, t0.ZUPDATEDATE, t0.ZZIP, t0.ZINFO FROM ZFAILEDBANKDETAILS t0 WHERE  t0.Z_PK = ?

我猜测的是sortDescriptor是用关键的details.closeDate初始化的,这是一个关系,所以当它按属性排序时,它必须获取每个对象的错误,导致数千行输出出现。

所以我改变了sortDescriptor来改为对属性city进行排序,这次我运行时得到以下输出:

2012-06-23 08:53:04.924 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK FROM ZFAILEDBANKINFO t0 ORDER BY t0.ZCITY DESC
2012-06-23 08:53:04.929 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0049s
2012-06-23 08:53:04.930 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0059s for 1009 rows.
2012-06-23 08:53:04.936 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCITY, t0.ZNAME, t0.ZSTATE, t0.ZDETAILS FROM ZFAILEDBANKINFO t0 WHERE  t0.Z_PK IN  (?,?,?,?,?,?,?,?,?,?)  ORDER BY t0.ZCITY DESC LIMIT 10
2012-06-23 08:53:04.938 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0013s
2012-06-23 08:53:04.939 FailedBankCD[89564:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCLOSEDATE, t0.ZUPDATEDATE, t0.ZZIP, t0.ZINFO FROM ZFAILEDBANKDETAILS t0 WHERE  t0.ZINFO IN  (?,?,?,?,?,?,?,?,?,?)  
2012-06-23 08:53:04.971 FailedBankCD[89564:fb03] CoreData: annotation: sql connection fetch time: 0.0318s
2012-06-23 08:53:04.972 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0326s for 10 rows.
2012-06-23 08:53:04.973 FailedBankCD[89564:fb03] CoreData: annotation: Prefetching with key 'details'.  Got 10 rows.
2012-06-23 08:53:04.974 FailedBankCD[89564:fb03] CoreData: annotation: total fetch execution time: 0.0372s for 10 rows.

我不再重复数千行输出,这似乎是预期的输出。但是,如果我再次运行,甚至没有修改任何东西,我再次得到数千行输出类似于以下内容:

2012-06-23 09:19:31.263 FailedBankCD[90216:fb03] CoreData: annotation: sql connection fetch time: 0.0006s
2012-06-23 09:19:31.264 FailedBankCD[90216:fb03] CoreData: annotation: total fetch execution time: 0.0010s for 20 rows.
2012-06-23 09:19:31.264 FailedBankCD[90216:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZCITY, t0.ZNAME, t0.ZSTATE, t0.ZDETAILS FROM ZFAILEDBANKINFO t0 WHERE  t0.Z_PK IN  (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)  ORDER BY t0.ZCITY DESC LIMIT 20

这是奇怪的行为,不是吗?任何人都可以快速复制这个并解释发生了什么,以及为什么我会得到数千行输出?

1 个答案:

答案 0 :(得分:1)

close_datecity未编入索引,这可以解释数千个查询,并且可能性能较低。对于运行之间的差异,我打赌你正在使用的缓存:

NSFetchedResultsController *theFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:managedObjectContext sectionNameKeyPath:nil
                                               cacheName:@"Root"];
相关问题