Tag: Cordata

掌握CoreData(第6部分,Core Data CRUD操作中实体之间的关系)

出于本部分的目的,我们将扩展Todo应用程序。 在这一部分中,我们将研究如何在架构中执行CRUD操作,在架构中有许多实体,并且一个实体与另一实体有关系。 请参阅第5部分,以了解我们将要工作的项目中的实体及其之间的关系 创建记录到核心数据 将记录添加到具有实体之间关系的核心数据的过程具有以下任务 从appdelegate单例对象引用persistentContainer 从persistentContainer创建/访问单例托管对象上下文 使用Task创建第一个实体,并为每个属性设置值 使用Task创建第二个实体,并为每个属性设置值 使用Passport创建一个实体并为每个属性设置值 使用User创建一个实体,并为每个属性设置值 我们刚创建的两个任务与用户对象相关联,代表了与用户相关的任务。 由于使用了用户→任务关系,所以使用了一对多NSSet 我们刚刚创建的与用户对象关联的护照,代表与用户关联的护照。 由于使用了用户→任务关系为一对一属性 将其保存到磁盘(永久存储) 通过调用save将保存到直接存储在文档中的sqlite磁盘文件中,您可以通过调用NSPersistentContainer上的静态方法defaultDirectoryURL来找到位置,如图1,2和3所示,我们刚刚创建的记录存储在磁盘上。 从核心数据中获取记录 从具有实体之间关系的核心数据中获取记录的过程具有以下任务 从appdelegate单例对象引用persistentContainer 从persistentContainer创建/访问单例托管对象上下文。 如您所见,我们每次都在做这项重复性工作,我们将在以后的部分中使用Core Data构建持久层时解决此问题。 创建了一个提取请求,以告知核心数据堆栈仅查看名称为Task的那些实体 执行我们的提取请求,它将从持久性存储中返回Task对象的数组 迭代刚从核心数据堆栈中获取的任务对象 以面向对象的样式打印任务详细信息 由于我们创建了逆关系,因此我们也可以访问User属性。 这是逆关系的好处之一。 如您所见,我们使用Task对象引用访问user.firstname属性。 由于逆关系, 任务对象还持有用户对象引用。 最后,我们可以使用Task对象访问Passport信息。 由于逆关系 。 在后面的部分中,我们将看到使用逆关系的更多好处 从核心数据中删除记录 从核心数据中删除具有实体关系的记录的过程具有以下任务 从appdelegate单例对象引用persistentContainer 从persistentContainer创建/访问单例托管对象上下文。 如您所见,我们每次都在做这项重复性工作,我们将在以后的部分中使用Core Data构建持久层时解决此问题。 创建了一个提取请求,以告知核心数据堆栈仅查看名称为User的那些实体 执行我们的提取请求,它将从持久性存储中返回User对象的数组 迭代刚从核心数据堆栈中获取的User对象 在上下文上使用delete()方法删除用户 由于User → Task删除规则是Cascade,因为我们删除了User对象。 它将自动删除所有与用户相关的任务 ,如图5所示,任务计数在数据库中返回0个任务对象。 由于User → Passport删除规则是“ Cascade”,因为我们删除了User对象,它将自动删除与用户相关联的护照信息,并且还返回0 […]

精通CoreData(第1部分介绍)

核心数据是用于管理应用程序中的模型层对象的框架。 它为与对象生命周期(运行时)和对象图管理(包括持久性)相关的常见任务提供了通用的自动化解决方案。 模型层对象 : 模型或数据层具有表示应用程序或视图所需数据的状态(过去或现在)和组织的对象。 登录按钮应启用还是禁用取决于模型或数据层状态。 这些东西将由模型层维护。 模型层中的常见任务: 创建模型 破坏模型 追踪 撤消和重做 对象之间的数据一致性。 延迟加载对象 自动验证属性值 架构迁移工具可简化架构更改并允许您执行有效的就地架构迁移 坚持不懈 快取 复杂的查询编译 版本跟踪和乐观锁定可支持自动多写程序冲突解决 注意:这些功能受Core Data支持。 在本系列中,我们将通过示例详细介绍这些功能。

掌握CoreData(第11部分:多线程并发规则)

假设您是在首次启动应用程序时将数百个或数千个主线程上的记录从捆绑数据导入Core Data中的? 结果可能是戏剧性的。 例如,您的应用程序可能由于启动时间太长而被Apple的监视程序杀死,这会显着降低UI性能,甚至可能导致其完全冻结,这不是良好的用户体验。 使用并发,您可以将任务导入其他线程,从而使您的主线程空闲,并且用户可以在不知道后台任何内容的情况下进行交互。 核心数据并发 并发是同时处理多个队列上的数据的能力。 提交到这些队列的工作在线程上执行。 核心数据,多线程和主线程 在核心数据中,作为核心数据堆栈核心的托管对象上下文可以与两种并发模式一起使用,这两种并发模式由NSMainQueueConcurrencyType和NSPrivateQueueConcurrencyType定义。 NSMainQueueConcurrencyType 专用于与您的应用程序界面一起使用,并且只能在始终在主线程上运行的应用程序的主队列中使用。 如前所述,它只能在与应用程序界面(UI)相关的工作中使用。 避免对此进行数据处理 。 ,就像将数据从JSON导入Core Data一样 NSPrivateQueueConcurrencyType 配置在初始化时创建自己的队列,并且只能在该队列上使用。 因为该队列是私有的,并且在NSManagedObjectContext实例内部,所以只能通过performBlock: 和 performBlockAndWait :方法对其进行访问。 在进行编码部分时,我们将对此进行深入研究。 零件中使用了 什么托管对象上下文 让managedObjectContext = appDelegate.persistentContainer.viewContext 以前,我们非常频繁地使用上述代码,并且我们从persistentContainer实例属性viewContext获取上下文。 顾名思义,其并发类型应为NSMainQueueConcurrencyType。 使用NSPersistentContainer时,viewContext属性被配置为NSMainQueueConcurrencyType上下文 PersistentContainer还具有两种方法 performBackgroundTask:和newBackgroundContext,与之关联的上下文被配置为NSPrivateQueueConcurrencyType。 核心数据旨在在多线程环境中工作。 但是,并非Core Data框架下的每个对象都是线程安全的。 要在多线程环境中使用Core Data,请确保: 受管对象上下文绑定到初始化时与之关联的线程(队列) 从上下文中检索到的受管对象被绑定到上下文所绑定到的同一队列 (将通过本节中的代码看到这两点) 规则1 受管对象上下文绑定到初始化时与之关联的线程(队列)。 转到目标→编辑方案→参数→添加参数“ -com.apple.CoreData.ConcurrencyDebug 1 ”,如图2和3所示。我们只是启用了Core Data Concurrency Debugging 如您在图4中看到的,我们正在打破这一规则。 我们正在使用在其他线程的主线程上创建的托管对象上下文。 我们通过执行许多任务来完成此任务 首先使用持久容器 […]