The managed object model

NSManagedObjectModel表示app中每個物件類型的數據模式

Note:NSManagedObjectModel是怎麼聯繫數據模式的?我們可以在Xcdoe上創建與編輯xcdatamodel這個文件,有一個特別的compiler(編譯器)叫momc,它complies model文件成為一套文件,然後放進一個momd資料夾中。

Core Data用momd資料夾中的內容在runtime初始化NSManagedObjectModel

The persistent store

atomic persistent store一定要加載到記憶體中才能提供讀寫

non-atomic persistent store可以根據需求加載到記憶體中

四個內建的Core Data儲存類型:

1.NSQLiteStoreType:

  • SQLite類型
  • 是唯一Core Data支援的non-atomic儲存類型
  • 因為其輕量與高效的記憶體佔用特性,是iOS專案的最佳選擇,也是Xcode的Core Data預設儲存類型

2.NSXMLStoreType:

  • XML類型
  • atomic儲存類型
  • 佔用大量的記憶體位置
  • 只在OS X上可用

3.NSBinaryStoreType:

  • 幾乎很少用

4.NSInMemoryStoreType:

  • 關掉App或重開機資料就會消失
  • 可以用在unit testing和某些caching上

Note:若要使用JSON或是CSV檔案可以subclassing NSIncrementalStore來創立自己的想要的類型

The persistent store coordinator

  • NSPersistentStoreCoordinator是managed object model和persistent store之間的橋樑
  • 負責用model和persistent stores來完成大部分Core Data的工作
  • 瞭解如何傳遞資訊給NSManagedObjectModel和從NSPersistentStore擷取資訊

NSPersistentStoreCoordinator隱藏了persistent store執行時設置的細節,這有兩個原因:

1.NSManagedObjectContext不用知道是儲存SQLite資料庫, XML文件或是自訂的儲存格式

2.如果有多個persistent stores,它提供managed context統一的接口

The managed object context

NSManagedObjectContext是這次Core Data學習中最常會接觸到的,其他三個只有在進階的Core Data使用才會用到

  • context是一個在記憶體中的暫存器,用來處理要管理的物件
  • 所有Core Data的工作都要用到managed object context
  • 任何操作都要直到呼叫save()才會影響到硬碟裡的檔案

關於contexts的五件事情:

1.context管理managed objects(受管理物件)的創造、擷取的生命週期,這個生命週期管理的功能包含faulting(故障),inverse relationship handling(反向關係管理)和validation(認證)

2.一個managed object必然會和context相關連,managed objects和context關係緊密,以致於每個managed object都保有一個context的reference

例如:

3.context的佔有欲很強(供殺毀),當一個managed object與特定的context相關連後,他會在生命週期中與其保持關連

4.一個應用可以使用不只一個context,大部分的Core Data應用都是如此類型。你可以在兩個不同的contexts上同時讀取一樣的Core Data物件

5.context並非thread-safe(線程安全)的,managed object也是一樣,contexts和managed object必須要在它們被創建的線程上作用

The persistent store container

NSPersistentContainer是iOS10的新玩意兒,集4種Core Data stack:

  1. the managed model
  2. the store coordinator
  3. the persistent store
  4. the managed context

於一身,現在可以簡單的初始化NSPersistentContainer,讀取persistent stores,就可開始操作Core Data

練習專案:Dog Walk