美股記帳 App / Part 2. CoreData & NSFetchedResultsController 存取資料
Published in
5 min readMar 12, 2022
原本我是用跟 watch list 一樣的方式,將資料存在 Data Container 裡,但考慮到未來要存取的資料一定一天比一天還要龐大,所以改成將資料存在 Core Data
記帳功能
- 新增,刪除,修改 交易紀錄
- 將資料存在 core data
- 用 NSFetchedResultsController update 新增跟修改的資料
設定 CoreData
首先,在建立 project 時先把 Use Core Data的選項勾起來,否則就得像我一樣上網搜尋怎麼之後把 core data 必要的檔案加上
SceneDelegate
將想要用到 core data 的 controller 放在裡面,透過 tabController >>navigationController >> 想要的 controller 的路徑 指定 controller 讀取 AppDelegate 的資料
AppDelegate
- 當資料改變時,立馬儲存資料
建立 Entities
- 將要存進 CoreData 的資料架構存進去
NSFetchedResultsController & NSFetchedResultsControllerDelegate
- NSFetchedResultsController : 管理從 CoreData fetch 的 data
- NSFetchedResultsControllerDelegate : 當從 CoreData fetch 的 data 有變化時,會出來管理
讀取資料
- NSSortDescriptor : sort data
- NSPredicate : filter data
- 記得將獨到的資料存回 local variable
if let fetchObject = fetchSpecificResultController.fetchedObjects{
self.transactionRecords = fetchObject
}
NSFetchedResultControllerDelegate 更新變動的資料
- 當從 Managed Object Context裡的資料有更動的時候,NSFetchedResultControllerDelegate 會幫我們 update tableView 的內容
- 記得在 controller(_:didChange:at:for:newIndexPath:)裡把有變動的資料存回 local variable
從 CoreData 新增,修改,刪除資料
因為 addTransaction 有可能把資料傳給兩個不同的 controller,所以我用 delegate 來傳資料
- 新增:將資料 insert 回 viewContext,並記得 saveContext
- 修改: 只需要 saveContext就好
- 刪除: viewContext.delete(removeItem) 並 saveContext
取出 core data 某一個 variable 的 unique value
用在列出使用者都存了哪些股票的 tableViewController,點擊就可以只看特定股票的交易紀錄
- 跟之前一樣從 core data 讀取資料
- 將讀出來的 array 用 Dictionary 的 group by 功能的到 unique stockSymbol 並把做成 array 給 tableView 用
- 在 NSFetchedResultsControllerDelegate 的 extension 裡把有關tableView update 的都刪掉,只剩在 didChange function 裡 存資料重新得到 unique stockSymbol 的 array