iOS 数据库相关随笔(1) —— CoreData基础介绍以及创建

背景

近期公司项目需要本地持久化保存一些用户信息数据,由于数据量的问题还有无需删除后保留,选择了使用数据库来保存这些信息。iOS数据库使用,大致有FMDB、WCDB、CoreData、Relam等,本次使用CoreData进行数据留存,作为随笔,后续其他数据库相关在后续学习中再行添加更新。

CoreData

CoreData是Apple 提供的一个用来管理轻量化数据库的框架,这个框架可以在单个设备上,本地化保存app的永久数据、缓存暂时数据、以及对数据的撤销操作等,使用CoreData,我们无需直接对数据库进行sql的语法操作,通过CoreData来在运行时中管理,CoreData通过抽象你的对象到存储区映射的细节,使得app能更简单的管理数据,无需直接操纵数据库。

CoreData创建

创建项目时勾上CoreData(Tip:也可以自己后续添加)


237C88B8-D0DE-44BF-8C94-FB877AE8D3FD.png

左侧文件树目录会出现一个.xcdatamodeld的文件,这个文件就是我们创建entity、建表、操作属性的地方。打开该文件。


CC6C6D62-7BC0-419C-855E-FE077BD31A0C.png

如图,左侧列表为我们在该模型文件中的:Entites 实体Fetch Requests 请求模板Configurations 配置信息,可以通过左下角加号按钮进行分别添加。

Entity

添加entity后,右侧列表中展示了该entity的具体结构信息,分为三部分:Attributes 属性Relationships 关联Fetched Properties 获取操作

  1. Attributes
    Attributes即为实体属性,我们需要为存储的属性创建对应的键,包括名字以及类型。这里介绍一下具体的属性类型以及一般我们常用的一些类型:

    • String: 字符串,在对应的类文件中以NSSString表示
    • Boolean: 布尔值,以NSNumber表示
    • Float: 单精度浮点小数
    • Double: 双精度浮点小数
    • Integer16 32 64: 整数,不同的范围,一般都用16,如果是为枚举类型而设立,可以使用16,对应类名中使用NSNumber,调用时记得取intValue即可。
    • Date: 时间,以NSDate表示
    • Binary Data: 二进制数据,以NSData表示
    • Transformable: OC对象,自动创建时以id表示,在对应的类文件中,我们可以改为具体的OC类名,但是该对象必须遵守NSCoding协议。
  2. Relationships
    Relationships为实体关联关系,顾名思义可将不同实体建立联系,CoreData会在该实体下一个属性,将之与被关联的实体所对应的属性关联起来。如图所示:

    FD3B4F26-EE88-4AAD-AC6B-D65B7246D315.png

    Destination表明为目标关联实体,Inverse表明为对应的关系,这样将一个addressmodel添加进accountmodel的同时,该addressmodel的relationship也会自动指向accountmodel,双方形成对应。
    8E8E6109-2B6E-4914-8D05-A95464A31DD9.png

    熟悉sqlite的朋友,其实relationship类似于外键,定义了实体之间的关系,type分为两种:一对一、一对多,对多关系的时候使用NSSet来存储模型。

  3. Fetched Properties
    定义查询操作,但我们一般都是在具体代码环境下具体定义操作,所以一般不怎么在这里设置。

  1. Data Model Inspector
    除开以上,我们可以对具体的entity、relationship进行一些属性上的设置:
    对于attribute:
  • default value: 设置默认值,注意二进制类型无法设置
  • optional: 代表可选,如果为NO,在进行save操作时该属性必须有值,否则返回error,默认为YES。
  • transient: 设置当前属性是否只保存在内存中,如果为YES,该属性将不会被本地持久化,适合用于存储一些内存中缓存的数据,比如一些临时的每次都会变更的数据。
  • index: 索引设置
  • Validation: Validation可以设置最大值与最小值来约束数据,数值类型为大小,字符串为长度、时间为约定时间。
  • Reg.Ex: 正则,设置正则表达式来约束数据,只用于验证和控制,并不对数据产生影响。

对于relationship:

  • Delete Rule: 删除规则,用于规定,当前对象被删除后,与之关联的对象的反应
    NSNoActionDeleteRule 删除后无操作,关联对象的关联属性不会被指向nil,注意此时再使用关联对象的关联属性可能会出现问题。
    NSNullifyDeleteRule 删除后置nil,将关联对象的关联属性指向nil,为默认设置
    NSCascadeDeleteRule 级联删除,将关联对象一起删除
    NSDenyDeleteRule 拒绝删除,如果当前对象还指向其他关联对象,则当前对象不能被删除

对于entity:
- Parent Entity: 设置父类实体,子类会继承父类的数据,但是这些数据会存于父类实体的表当中,当多个子类继承于同一父类时,所有子类的父类部分都会存放于父类表中,这里会有性能问题。(继承属性名字不要相同)

Fetch Requests

一些更加简单直观的请求配置,一般也不做设定。

可视化模型

CoreData右下角界面的editor style,可以使我们自由切换表格展示或者是图形可视化展示,更加轻松的看到实体与属性的关系,实体与实体之间的联系。如上图。

创建托管对象类文件

当我们在模型中创建好实体后,就要根据实体,生成我们在具体开发中使用的,基于NSManagedObject类的托管类对象文件了,我们通过这类对象来进行对数据库的操作。

xcode为我们提供了自动化生成的方式,在菜单栏Editor -> Create NSManagedObject Subclass -> 选择对应数据库版本(后续再说数据库版本相关) -> 勾选对应要生成托管类的实体 -> 生成文件。图略

2466F355-A5E6-40D5-AF35-3C25D6AD0513.png

在左侧文件数列表可见,每个实体都对应生成了4个文件:
分别是以实体名开头的.h.m以及实体的Category文件

托管对象类文件

以实体名生成的文件,这个文件xcode没有生成任何多余的代码,是用来让我们添加自己的用来管理操作数据库的的相关逻辑代码,相当于一层单例Manager,我们自己app内的增删改查方法逻辑就写在这里(app -> CoreData),方法内的具体CoreData Api调用才是操作数据库的一层(CoreData -> Database)。
如果有设置relationship,类文件会声明@class

Category 分类

点开分类,里面有xcode自动生成的一系列代码,包括我们在xcdatamodeld中设置的实体属性:
如果我们设置的relationship的type为一对多,那么就会有CoreDataProperties 实体属性以及CoreDataGeneratedAccessors 对多属性集合方法
前者表明具体实体的AttributesRelationships,后者为系统生成的管理对多方法,都是在运行时中动态实现的,分类文件可以不管。
前文有提到设置属性的类型,xcode为我们自动生成的分类文件中,transformalbe的位置是id,需要我们手动改写成我们需要的类名(遵守NSCoding协议,因为要被归档),其他数值类型的默认都为NSNumber,当然创建托管类对象文件的时候可以勾选Use scalar properties for primitive data types来生成具体对应的标量类型属性,那创建出来就是具体的比如int_16double等类型。

注意当更新属性后,要记得重新生成托管类对象文件!!!
基本的介绍以及创建过程就是这样,后续会更新CoreData 内对于数据库的操作!谢谢。

一些小问题(更新)

  1. 当我们创建xcdatamodeld的同时,Core Data就已经生成了对应的default文件了,只是左侧的文件树目录看不到,这时候如果我们再手动生成托管类对象文件的时候,编译器就会报重复错误,需要在xcddatamodeld中,选择每个实体,将Inspector中的Codegen选项,选择Manual/None即可
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容