热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

核心数据和Swift:数据模型

介绍

在本系列的第一篇文章中 ,我们了解了Core Data堆栈,它是Core Data应用程序的核心。 我们探索了托管对象上下文,持久性存储协调器和托管对象模型。

本文重点介绍Core Data应用程序的数据模型。 我们放大Xcode的数据模型编辑器,然后看一下实体,属性和关系。

先决条件

我在本系列的“核心数据”中介绍的内容适用于iOS 7+和OS X 10.10+,但是重点将放在iOS上。 在本系列中,我将使用Xcode 7.1和Swift 2.1。 如果您更喜欢Objective-C,那么我建议阅读我先前关于Core Data framework的系列文章 。

1.数据模型编辑器

首先从上一教程中下载项目,或者从GitHub克隆存储库。 在Xcode中打开项目,然后在“ 项目浏览器”中搜索Core_Data.xcdatamodeld 选择项目的数据模型时,Xcode自动显示数据模型编辑器。

核心数据和Swift:数据模型

2.实体

在探索编辑器的用户界面之前,我们需要创建一个要使用的实体。 在数据模型编辑器的底部,单击“ 添加实体”按钮。 这将添加一个名称为Entity的实体 它将显示在数据模型编辑器左侧的“ 实体”部分中。 将实体名称更改为 在“ 实体”部分中双击该

核心数据和Swift:数据模型

“什么是实体?” 您可能想知道。 为了带回数据库的类比,实体与数据库中的表具有可比性。 选择Person实体时,您会看到一个实体可以具有属性,关系和获取的属性。 现在不必担心获取的属性,它们是框架的更高级功能。

3.属性

通过单击“ 属性”表底部的加号按钮,为“ 人”实体赋予属性 双击属性名称并将其设置为 首先 从“ 类型”下拉菜单中,选择“ 字符串” 如果我们将此与数据库中的表进行比较, Person表现第一 String类型的有一栏。

核心数据和Swift:数据模型

即使我不想通过将实体与数据库表进行比较来使您感到困惑,它也使您更容易理解什么是实体和属性。 实际上,如果您使用SQLite数据库作为应用程序的后备存储,则Core Data将创建一个表供您存储Person实体的数据。 但是,这是我们不必且不必担心的事情。 请记住,核心数据不是数据库。

关系也是如此。 我们不需要担心核心数据如何跟踪关系。 实际上,Core Data确保仅在应用程序需要它们时才加载关系。 这是本系列后面的内容。

Person实体添加另外两个属性, 最后一个String类型,并且ageInteger 16类型。 此时,您选择的数字类型并不重要。 它告诉Core Data如何构造持久性存储并优化性能。

属性选项

可以通过数据模型检查器配置实体的属性。 选择“ 个人”实体的第一个属性,然后打开右侧的检查器。 使用数据模型检查器可以配置选定的属性。 至此,我们只对一些设置OptionalAttribute TypeDefault Value感兴趣。

可选的

将属性标记为可选意味着该属性可以为空,也可以保留为空白。 但是,在我们的示例中,我们要确保每个Person记录都有一个名字。 选择第一个属性后,取消选中“ 可选”以将其标记为必需。 默认情况下,新属性是可选的。

但是,将属性标记为必需会产生后果。 如果我们保存的人名记录没有有效的名字,则核心数据将引发错误。 这意味着在保存之前,我们需要确保已设置记录的第一个属性。

属性类型

由于多种原因,属性类型很重要。 它告诉Core Data应该以哪种格式保存属性,并且还将以指定格式将属性的数据返回给我们。 每种属性类型都有一组不同的配置选项。 第一个属性的属性类型更改为Date,以查看类型为Date的属性的配置选项。

默认值

几种属性类型,例如StringDate ,都可以设置一个Default Value字段。 例如,如果需要属性,并且要确保将记录的属性插入数据库时​​,该属性具有有效值,这将很方便。

请注意,默认值仅在创建新记录时使用。 例如,如果通过将第一个属性设置为nil来更新现有的Person记录,则Core Data不会使用默认值填充第一个属性。 相反,Core数据将引发错误,因为我们根据需要标记了第一个属性。

4.关系

当您开始处理实体之间的关系时,核心数据才真正发挥作用。 让我们通过添加第二个名为Address的实体来了解其工作原理。 Address实体具有字符串街道数字城市国家类型的四个属性。

实体之间的关系具有许多定义特征,名称,目的地,关系的基数,逆关系以及关系的删除规则。

让我们通过在PersonAddress实体之间创建关系来更详细地探讨关系。

名称,目的地和可选性

通过选择“ 个人”实体并单击“ 关系”表底部的加号按钮来创建关系。 命名关系 地址并将“ 目的地”设置为“ 地址”实体。 这表明每个人记录都可以与一个地址记录相关联。

核心数据和Swift:数据模型

与属性一样,默认情况下关系是可选的。 这意味着,如果个人记录与地址记录没有关系,则不会引发验证错误。 让我们通过在右侧的数据模型检查器中取消选中“ 可选”复选框来更改此设置。

反向关系

此刻,该人可以与地址记录有关系。 但是,如果该人具有与之关联的地址记录,则该地址记录将不知道该人记录,因为此刻的关系是从PersonAddress的单向关系。 但是,Core Data中的大多数关系都是双向的,两个实体都知道该关系。

通过选择地址实体并创建一个以Person实体作为目的地的名为person的关系,来创建从Address实体到Person实体的逆关系。

核心数据和Swift:数据模型

即使我们创建了AddressPerson之间的逆关系,Xcode 也会给我们一些警告,告诉我们Person.address 应该具有逆,Address.person应该具有逆 我们做错了吗?

Core Data不够聪明,无法知道哪个关系是哪个关系的逆向关系。 这很容易解决。 选择Person实体,然后将address关系的Inverse设置为personperson关系。 如果现在选择“ 地址”实体,您将看到地址关系的逆关系已被设置为“ 人”关系。

数据模型图

当数据模型变得复杂时,关系会变得混乱和不清楚。 Xcode可以遮盖住您。 数据模型编辑器具有两种样式: tablegraph 在编辑器的右下角,您应该看到一个切换 ,“ 编辑器样式” ,可让您在两种样式之间进行切换。 单击右侧的按钮以切换到图形样式。

核心数据和Swift:数据模型

图的样式向您显示了我们到目前为止创建的对象图。 它向我们展示了我们创建的实体,它们的属性以及它们之间的关系。 但是,最有用的功能之一是数据模型实体之间关系的可视化表示。 两端带有箭头的线连接“ 人”和“ 地址” ,表示它们的双向关系。

核心数据和Swift:数据模型

一对多关系

到目前为止,我们创建的关系是一对一关系 ,一个人可以有一个地址,反之亦然。 但是,可能有几个人住在同一个地址。 我们如何将这些额外的信息包括在数据模型中?

关系的基数指定是一对一还是一对多关系。 让我们改变了地址实体的的关系,使之成为一对多的关系。 选择地址实体的人员关系,将其名称更改为人员以反映多对多关系,然后在右侧的检查器中将关系类型设置为“多对多 ”。

核心数据和Swift:数据模型

关系的名称并不重要,但是表明这是一对多的关系。 请注意,数据模型图会自动更新。 Person实体的关系端点有两个箭头,表示该关系的多对多性质。

多对多关系

等一下。 一个人可能与一个以上的地址相关联吗? 一个人可以有一个工作地址和一个家庭住址。 对? Core Data通过创建多对多关系来解决此问题。 选择Person实体的地址关系,将其名称更改为address ,并将关系Type设置为To Many 数据模型图将更新的关系显示为两端带有两个箭头的线。

核心数据和Swift:数据模型

自反关系

核心数据实现关系的方式非常灵活。 关系的目标实体甚至可以与源实体相同。 这被称为自反关系。 也可能具有相同类型的不同名称的多个关系。 例如,一个人可以有一个母亲和一个父亲。 两种关系都是自反的,唯一的区别是关系的名称。

删除规则

关系的一端的记录被删除时会发生什么? 如果您将核心数据视为数据库,那么答案将是显而易见的。 但是,核心数据不是数据库。

假设您有一个Account实体与一个User实体有一对多的关系。 换句话说,一个帐户可以有多个用户,并且每个用户都属于一个帐户。 删除用户会怎样? 删除帐户会怎样? 在“核心数据”中,每个关系都有一个删除规则,该规则可清楚说明在这些情况下会发生什么。

删除规则确保您不必担心删除记录时显式更新持久性存储。 核心数据会注意这一点,以确保对象图保持一致状态。

选择人员实体的地址关系,然后打开右侧的检查器。 Delete Rule菜单具有四个选项, No ActionNullifyCascadeDeny

没有行动

如果选择No Action ,则Core Data不会更新关系或将关系通知给源记录。 这意味着该关系的源记录仍然认为它与已删除的记录有关系。 这很少是您想要的。

无效化

当删除目标记录时,此选项将关系的目标设置为null。 这是关系的默认删除规则。 例如,如果关系是可选的,则可以应用此删除规则。

级联

如果“从人员地址”的关系设置为Cascade ,则删除人员记录也将删除与该人员记录关联的所有地址记录。 例如,这在需要关系并且没有关系就不能存在或不应该存在记录的情况下很有用。 例如,如果用户未与帐户关联,则该用户不应存在。

拒绝

从某种意义上说, DenyCascade的逆。 例如,如果我们有一个帐户实体与一个删除规则设置为“拒绝”用户实体具有一对多关系,则只有在没有与之关联的用户记录的情况下,才能删除该帐户记录。 这样可以确保没有帐户记录就不会存在用户记录。

结论

在本教程中,我们仔细研究了Core Data应用程序使用的数据模型。 现在,您应该熟悉实体,属性和关系,并且应该能够使用Xcode的数据模型编辑器创建它们。

Core Data非常擅长管理关系,而Xcode的数据模型编辑器使创建和管理实体之间的关系变得容易。 实体之间的关系功能强大且易于配置。 删除规则可确保Core Data管理的对象图保持健康且处于一致状态。

在下一篇文章中,我们开始动手工作,并开始使用Core Data。 您将学习如何创建,读取,更新和删除记录,并熟悉NSManagedObjectNSFetchRequest

翻译自: https://code.tutsplus.com/tutorials/core-data-and-swift-data-model--cms-25067


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Xcode离线安装帮助文档1.在线查看帮助文件:Xcode下查看帮助文件,菜单Help-DeveloperDocumentation在右上角搜索框中即可检索,但速度很慢 ... [详细]
author-avatar
手浪用户2602916293
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有