記帳App|Part5. CoreData 資料存取-NSFetchedResultsController 監控資料

CoreData, NSFetchedResultsController

記帳App 最初是將資料存在app的資料夾裡 FileManager.fefault.url 。但帳務資料為大量資料,因此將資料儲存位置更變為CoreData。

本篇提及功能:
1. 在 SceneDelegate 設定,指定 controller 讀取 AppDelegate 資料
2. 在 AppDelegate 加入當 view.hasChanges 時執行資料儲存 function

3. NSFetchedResultsController 監控資料,抓取資料(含:指定範圍資料)
4. CoreData 新增更新刪除資料

SceneDelegate

在SceneDelegate設定,指定 controller 讀取 AppDelegate 資料,須依照其路徑,才能成功地將資料傳遞。TabController >> NavController >> TargetController

AppDelegate

在 NSPersistentContainer 加入當 view.hasChanges 時執行資料儲存動作的function。

CoreData-NSFetchedResultsController

NSFetchedResultsController 官方文件是寫著是用來管理CoreData的fetch request回傳的結果<ExpenseData(抓取的資料型別)>,並將資料顯示給使用者。

使用前需要先匯入CoreData框架,還要遵從NSFetchedResultsControllerDelegate並指定委派來監控資料變化。

抓取指定範圍資料

使用NSpredicate指定指定範圍資料

TableView資料更新

當發現Managed Object Context內的資料有變動時,fetchedRequest會通知 NSFetchedResultsController 有變動,接著透過NSFetchedResultsControllerDelegate 來更新Table View畫面。

controller(_:didChange:at:for:newIndexPath:)用來通知接收者Managed Object Context有增加、刪除的動作,在此設定tableView動作。

CoreData 資料新增刪除

新增資料context.insert加入資料,因為是在B頁面填寫帳務資料,將資料回傳A前頁判斷是修該資料或是資增資料。新增資料後,呼叫container.saveContext()將資料儲存。
*在建立新的資料時,必須就以 NSManagedObject 作建立,才能正確新增資料。

NSManagedObject

更新資料呢?因不是新增或刪除資料,則直接將欲更新直接儲存( 呼叫container.saveContext()將資料儲存 )

刪除資料則在context.delete 就能執行刪除資料,刪除資料後必須再呼叫container.saveContext()將資料儲存。

GitHub

--

--