記帳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 作建立,才能正確新增資料。
更新資料呢?因不是新增或刪除資料,則直接將欲更新直接儲存( 呼叫container.saveContext()
將資料儲存 )
刪除資料則在context.delete
就能執行刪除資料,刪除資料後必須再呼叫container.saveContext()
將資料儲存。
GitHub