我有一個非常小的樣本項目,可以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
這是古怪的行爲,不是嗎?任何人都可以快速複製這個並解釋發生了什麼,爲什麼我會得到數千行輸出?
結果是一樣的嗎?我不會擔心Core Data翻譯引擎蓋下的查詢。 –