美股記帳 App / Part 2. CoreData & NSFetchedResultsController 存取資料

Julia
彼得潘的 Swift iOS / Flutter App 開發教室
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

GitHub:

作品 Link :

--

--