核心数据的构建块

Core Data是Apple开发的框架。 它于2005年首次用于Mac OS。 后来它于2009年在iOS上可用。我相信,现在它是最可爱的框架。

好吧,正如我提到的,核心数据是一个框架。 它还是一个对象图管理器。 它曾经将数据持久存储在磁盘上。

对象图不过是相互连接的对象的集合。

核心数据栈

核心数据堆栈不过是三个关键对象的集合,这些对象负责处理所有外部数据存储。

  • 托管对象模型
  • 托管对象上下文(MOC)
  • 持久性商店协调员

托管对象模型

托管对象模型是NSManagedObjectModel类的实例。 它用来表示核心数据应用程序的数据模型。 这是初始化Core数据堆栈时的第一步。 初始化时,这通常会先加载到内存中。

资料模型

数据模型是应用程序捆绑包中的文件,其中包含应用程序的数据架构。 正如您在图1中看到的那样,受管对象模型与数据模型相连。

持久性商店协调员

持久性存储协调器是NSPersitentStoreCoordinator类的实例。 它在核心数据堆栈中起关键作用。 它在Core数据堆栈中的Managed Object Model之后被实例化。 因此,它对托管对象模型及其结构(具有模型对象)具有清晰的了解。 它保留每个模型对象的引用。 如图1所示,持久性存储协调器与托管对象模型,MOC和持久性存储连接。 因此,可以说,持久存储协调器是连接所有边缘的桥梁。

我们的应用程序中可以有多个MOC和多个持久性存储。 但是很少有多个持久性协调员。 它将多个持久性存储作为单个聚合持久性存储呈现给MOC。

托管对象上下文

托管对象上下文(MOC)是NSManagedObjectContext类的实例。 MOC可以创建,读取,更新和删除模型对象。 是我们经常互动的实例。 如您所见,这与持久性存储协调器有关。 MOC通过持久性存储协调器获取模型对象。 如前所述,我们可以拥有多个MOC。 好吧,这是核心数据的高级主题,我将在另一个故事中对此进行讨论。

受管对象上下文就像一个便笺本。 它通过从持久性存储,持久性存储协调器以及我们要存储的数据中捕获数据来创建模型图。 现在,您可以根据需要修改这些数据。 除非您将更改保存在持久性存储中,否则持久性存储将不了解更改。


NSPersistentContainer

iOS 10中引入了NSPersistentContainer。此容器具有核心数据堆栈,并提供可使用的MOC。 因此,在使用它之前,您应该了解核心数据栈。

好吧,我想是时候进入代码了。 让我们看看核心数据是如何工作的。


演示版

让我们开始一个新的单视图应用程序并检查核心数据模块。

XCode足够明智。 它曾经在我们的应用程序中以.xcdatamodeld扩展名添加数据模型文件。 文件名应为your-application-name.xcdatamodeled。

XCode还在AppDelegate中添加了核心数据。 您将找到一个persistentContainer实例和saveContext方法。

让我们打开数据模型,然后单击“添加实体”按钮。 它将在您的ENTITIES列表中创建一个默认实体,默认名称为“ Entity”。 双击它,然后将其名称更改为“ Employee”。 然后单击“属性”部分中的“ +”按钮,然后将属性添加到“雇员”实体中。

现在,我们已经设计了数据模型。 因此,创建“ DataController”模型类并将记录添加到持久性存储的时间到了。

创建托管对象上下文

如前所述,托管对象上下文可以创建,读取,更新和删除模型对象。 因此,我们将创建一个托管对象上下文实例。

  let moc:NSManagedObjectContext = { 
让appDelegate:AppDelegate = UIApplication.shared.delegate为! AppDelegate
让context = appDelegate.persistentContainer.viewContext
返回上下文
}()

创建和保存托管对象

托管对象是NSMangedObject类的实例。 它具有一个实体描述(一个NSEntityDescription实例)和一个MOC。 实体描述包括对象代表的实体名称及其属性和关系。

 让employee:Employee = NSEntityDescription.insertNewObject(forEntityName:“ Employee”,成:moc)为! 雇员 

然后使用“员工”属性映射要存储的所有详细信息。

从核心数据获取

由于我们已将数据保存在持久性存储中。 现在是时候获取并显示这些数据了。 为此,我们需要创建一个提取请求。

 让fetchRequest:NSFetchRequest  = Employee.fetchRequest() 

然后从托管对象上下文中获取托管对象。 它将返回一个托管对象数组。

美好结局。 下一步是什么?

好了,这就是我们到目前为止讨论过的核心数据的基础。 但是核心数据更为复杂。 我们可以做更新和删除记录。 此外,我们可以添加谓词以获得过滤结果。


谢谢阅读。 希望你喜欢它。 随时发表评论。