天天看點

《Core Data應用開發實踐指南》一2.12 後端SQL的可見性

本節書摘來自華章出版社《core data應用開發實踐指南》一書中的第2章,第2.12節,作者 (美)tim roadley,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

如果隻在控制台的日志中檢視core data所輸出的結果,那麼意義并不算太大。你知不知道這些事情背後究竟發生了什麼?core data對持久化存儲區中的資料到底進行了哪些操作?這些操作是否恰當?為了提供無縫的core data體驗,系統都生成了哪些sql查詢語句?每次在模拟器中運作程式的時候,是不是會插入重複的對象?

有個極其詳盡的調試選項可以提供足夠的資訊,告訴你這些操作背後所發生的事情,進而令你知道上述那些問題的答案。這個調試選項會把系統自動生成的sql查詢語句列印出來,使開發者深刻認識到core data的工作原理。

請按下列步驟修改grocery dude,以便開啟sql debug模式:

點選product>scheme>edit scheme...菜單項。

點選run grocery dude,并切換到arguments分頁。

點選arguments passed on launch區域中的“+”按鈕,以新增參數。

輸入新參數-com.apple.coredata.sqldebug 3,然後點選ok按鈕。

現在我們已經開啟了第三級(level 3)的sql debug模式,然後重新運作應用程式。按下手機的home鍵(如果是在模拟器中運作,那就按“shift++h”組合鍵或點選hardware>home菜單項),并觀察控制台中的日志。你會看到,系統自動生成了一些insert語句,開發者無須手工編寫這些語句。圖2-7顯示了其中一部分輸出資訊。

《Core Data應用開發實踐指南》一2.12 後端SQL的可見性

在圖2-7中,sqlite bind[0]至sqlite bind[7]等變量都是用來拼合insert語句的,而這種insert語句的用途則是把托管對象的特性值插入到zitem表的行中,這張表位于持久化存儲區裡。zitem表是同item實體相關聯的。通過名稱可以看出實體的屬性與資料庫中的field(字段)是怎樣對應起來的。core data使用字首字母“z”作為其标準的命名約定。

為了驗證儲存在sqlite持久化存儲區裡的托管對象,你可能需要借助第三方工具來檢視其内容。請注意:筆者并不建議直接修改資料庫。圖2-8示範了如何尋找包含grocery-dude.sqlite檔案的ios 仿真器工作目錄。由于library目錄是隐藏的,是以需要右擊finder,選擇go to folder菜單項,然後手工輸入目錄名。具體的目錄位置是:/users/username/library/application support/iphone simulator/,當然了,你需要把其中的username部分替換為自己的使用者名。applications目錄下面的子目錄名稱可能會和書中有所不同,因為這是個随機生成的guid。

《Core Data應用開發實踐指南》一2.12 後端SQL的可見性

除了grocery-dude.sqlite檔案以外,在同一目錄下還有兩個分别以-wal及

-shm結尾的檔案。ios 7預設會采用一種新的“資料庫日志記錄模式”(database journaling mode),而這兩個檔案正是由這種記錄模式所生成的。第8章将會詳細讨論這一模式。對于目前來說,為了檢視grocery-dude.sqlite的内容,我們必須先禁用這種模式。要想禁用ios 7預設的日志記錄模式,就必須在添加持久化存儲區的時候傳入一種新的選項。

請按下列步驟修改grocery dude,以便禁用ios 7預設的日志記錄模式:

修改coredatahelper.m檔案的loadstore方法,把下面這行代碼添加到nserror*error = nil這一行之上:

《Core Data應用開發實踐指南》一2.12 後端SQL的可見性

在coredatahelper.m檔案的loadstore方法中找到調用的addpersist-entstorewithtype那行語句,把其中的options:nil換成options:options。

再次運作應用程式,然後-wal檔案應該就會消失了,這表明所有資料都已存放到grocery-dude.sqlite檔案裡面了。可将-shm檔案删除,也可忽略該檔案。

通過google可以搜到很多能夠打開sqlite資料庫檔案的資料庫浏覽工具。在sourceforge網站上有一款好工具,名字叫做sqlite database browser,筆者建議你現在就把它下載下傳下來,并安裝在電腦上試試看。由于該程式未經簽名認證,是以需要在system preferences>security & privacy>general中開啟allow applications downloaded from anywhere選項,然後才能使用。如果不想為了使用該程式而開啟這個選項,那麼可以在mac app store中搜尋extension:sqlite,這也是一款能夠打開.sqlite檔案的程式,而且它通過了mac app store的認證。

雖說檢視資料庫的内容對程式調試工作很有幫助,但是對于這種由core data所管理的資料庫來說,不應該在編寫代碼時依賴它内部的私有模式,因為蘋果公司可能會在不通知開發者的前提下自行改變其結構。

由于library檔案夾是隐藏的,是以若想檢視grocery-dude.sqlite檔案的内容,友善一些的辦法是:直接在這個檔案上面點選滑鼠右鍵,選擇open with菜單,然後指定用sqlite database browser來打開它。請注意,在xcode中正在運作grocery dude程式的時候,不要用資料庫浏覽工具打開sqlite檔案,否則應用程式在嘗試打開資料庫時會逾時。

圖2-9示範了持久化存儲區中的托管對象所具備的各種特性值。

《Core Data應用開發實踐指南》一2.12 後端SQL的可見性

假如發現了重複的條目,那就說明上下文儲存了不止一次。目前來看,隻有當使用者按下手機的home鍵時,程式才會儲存上下文。而程式每次啟動的時候,demo方法都會插入新對象,于是就産生了重複。但現在不用擔心此問題,因為稍後我們就會講解如何删除托管對象。

請按下列步驟修改grocery dude,以免再産生重複的資料:

修改appdelegate.m檔案的demo方法,把nslog以外的所有代碼都删掉。