#Task:Part.06–近期帳務,CoreData讀取和刪除、NSFetchedResultsController監控資料

各位觀眾!目前讓我卡關最久的大魔王終於被我KO啦🎉其實一開始我很快就完成了從CoreData讀取資料顯示在TableView,但為了達到以日期為Section的顯示方式…我繞了很多遠路而且死了很多腦細胞🤯最後才發現,原來我少實作了一個NSFetchedResultsControllerDelegate的Function,只要加上短短幾行程式碼就能拯救我的APP🤪

這篇文章我會紀錄近期帳務的製作,包含如何從CoreData讀取和刪除資料、NSFetchedResultsController如何監控資料並回傳變更到TableView,如果有興趣就一起看下去吧!至於帳務的CoreData實體建立和儲蓄心願的步驟一樣,只是屬性相較之下比較多,可以參考#Task:Part.05–儲蓄心願編列,CoreData儲存

遵從UITableView Protocol;註冊HeaderView、Cell

由於這個頁面不是直接使用UITableViewController,一開始要記得遵從UITableViewDataSource、UITableViewDelegate,並實作相關的Function。而HeaderView和Cell在最初設計Storyboard時,我分別建立了Xib來製作,所以在RecentAccountingViewController要使用就必須先註冊,才能在後續程式碼得到匹配的實體。

關於TableView我使用到的Function如下:

DataSource ➟處理資料,將所有要顯示在畫面上的資料傳過去。
numberOfSections、numberOfRowsInSection、cellForRowAt、

Delegate ➟處理介面,將所有對於畫面上的操作反映回系統。
heightForRowAt、heightForHeaderInSection、viewForHeaderInSection、trailingSwipeActionsConfigurationForRowAt

使用NSFetchedResultsController

NSFetchedResultsController用來監控CoreData變動後所回傳的結果,並提供資料給TableView。使用前需要先匯入CoreData框架,還要遵從NSFetchedResultsControllerDelegate並指定委派來監控資料變化。

讀取資料

建立一個變數存放從CoreData讀取出來的資料,在viewDidLoad讀取資料。整個流程為:從RecordMO取得NSFetchRequest物件➟使用NSSortDescriptor指定物件間的排序➟透過AppDelegate取得資料➟建立ManagedObjectContext➟初始化fetchResultController➟指定委派監控資料變化➟呼叫performFetch()執行讀取結果➟存取fetchedObjects屬性取得RecordMO物件。

實作UITableViewDateSource、UITableViewDelegate

現在的資料都是從資料庫獲得,TableView也依據這些資料來顯示畫面。

刪除資料

刪除資料的做法很簡單,一樣要透過AppDelegate取得資料再建立ManagedObjectContext,最後使用ManagedObjectContext的delete方法,要刪除的資料位置就是目前的indexPath,呼叫saveContext()儲存更變。刪除的動作我寫在trailingSwipeActionsConfigurationForRowAt,程式碼可以參考上面一段。

實作NSFetchedResultsControllerDelegate

如果有任何的內容更變,NSFetchedResultsControllerDelegate的Function會自動被呼叫。我在這裡實作了四個方法,一開始卡很久就是因為少做了其中的didChange sectionInfo,導致資料更變時TableView找不到正確的位置😩繞了非常多遠路修改程式卻還是有問題,最後才找到真正的病根!只要實作didChange sectionInfo就解決啦👌🏻

=====

大功告成!這篇文章我盡量寫得簡單卻完整,一方面複習製作過程,一方面當成學習筆記。雖然我的作品走到現在進度有點慢…但所有功能我都很努力去了解、克服才完成,就算繞遠路也是一種學習💪🏻

如果有什麼建議歡迎留言~有興趣可以取用我的檔案🙆🏻‍♀️

心願記帳Part.06到這邊結束,我會努力的🙇🏻‍♀️🙇🏻‍♀️🙇🏻‍♀️

未完待續,敬請期待…

--

--