Swift利用CoreData如何存储多种数据类的通讯录

前言

我们在上一篇文章简单的实现了一个通讯录,说是通讯录实际上就只是一个简简单单的Name List。这次我们要往这个通讯录里面加入更多的元素,目的也是为了学习CoreData如何存储更多的数据类型。下面话不多说了,来随着小编一起看看详细的介绍吧。

完成后的效果:

1. CoreData支持存储数据类型

咦?这里面有两个好像很少看到的类型:Binary Data、Decimal、Transformable。这些都是神马东西?

1.1 Binary Data

顾名思义,就是二进制数据。对应到OC中就是NSData, Swift里面就是Data数据类型。

我们这次就试试在通讯里面存储一下图片,把图片变成Binary Data进行存储。

1.2 Decimal

Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部分以及小数部分的位数。使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间。

Decimal(n,m)表示数值中共有n位数,其中整数n-m位,小数m位。例:decimal(10,6),数值中共有10位数,其中整数占4位,小数占6位。

问题来了,Decimal(2,1):

1, 插入数据“12”会怎样?

会出现数据移除的错误。

2, 插入”1.2345“会怎样?

会自动四舍五入成1.2

3, 插入2,会怎样?

会自动补充成2.0,以确保2位的有效长度和1位的小数。

1.3 Transformable

这个类型就比较搞了,有人说它是万能类型,有人说它只要是对象就都可以。

在官方文档里面,Core Data Release Notes for OS X v10.5 是这么介绍的:

Transformable Attributes
There's a new "transformable" type for NSManagedObject attributes that allows you more easily support attribute types that Core Data doesn't support natively. You access an attribute as a non-standard type, but behind the scenes Core Data uses an instance of NSValueTransformer to convert the attribute to and from an instance of NSData. Core Data then stores the data instance to the persistent store.

If you don't specify a transformer, transformable attributes to use keyed archiving (NSKeyedUnarchiveFromDataTransformerName).

For more details, see Non-Standard Persistent Attributes.

说到底,这是一个非标准的类型。在中文中,非典型技术宅胖其实觉得翻译成“其他”类型更贴切。哈哈~~就和有关部门一样d=====( ̄▽ ̄*)b厉害。

有一点点小小需要注意的地方就是,数据类型要遵守NSCoding协议。只要遵守了,就可以使用这个厉害的存储类型了。

来来来,举几个栗子。Dictionary、Array、Number等等都可以呀。。。

感情是个万金油类型!!

2. 使用CoreData存储多种数据类的通讯录

我们在这里计划存储的类型有Data、Bool、String、Date、Int64。

2.1 CoreData的基本读取操作

2. 1.1 获取CoreData已经保存数据的五个步骤

  • 获取总代理和托管对象总管
  • 从Entity获取一个fetchRequest
  • 根据fetchRequest,从managedContext中查询数据
  • 保存。保存过程中可能会出错,要做一下处理。
  • 添加到数组中

2.1.2 基本存储

  • 获取总代理和托管对象总管
  • 建立一个Entity
  • 保存内容
  • 保存Entity到托管对象。如果保存失败,进行处理
  • 保存到数组中,更新UI

2.2 多种类型的存储

let imgData = from.value(forKey: "avatar") as? Data
let isRelative = from.value(forKey: "isRelative") as? Bool
let name = from.value(forKey: "name") as? String
let updateTime = from.value(forKey: "updateTime") as? Date
let viewTimes = from.value(forKey: "viewTimes") as? Int64
let mobile = from.value(forKey: "mobile") as? String

来来来,就这样轻松easy的把各种类型的都转换好啦~ 然后就可以存入进去了呐。

3. Codable

咱们通讯录里面通常的做法都会把一个用户的信息全部放在一个Model里面,然后只需要把Model存储到库里面就好了。这个怎么做呢?

在OC时代,当需要将一个对象持久化时,需要把这个对象序列化,往常的做法是实现 NSCoding 协议。

写过的人应该都知道实现 NSCoding 协议的代码写起来很痛苦,特别想哭,尤其是当属性非常多的时候。

于是乎,Swift 4 中引入了 Codable 帮我们解决了这个问题。

struct User: Codable {
 var avatarImg: Data
 var isRelative: Bool
 var name: String
 var updateTime: Date
 var viewTimes: Int64
 var mobile: String
}

如果我们想把User 对象的实例持久化,只需要让 User 遵守 Codable 协议即可,Language 中不用写别的代码。这样就可以直接把Userencode成JSON啦。

下一篇我们就不能再用Xcode创建自带的CoreData来搞事情了,我们要自己搞一个CoreData Stack来实现管理。

所有的源代码都在这里:

github地址:https://github.com/Stanbai/CoreDataDemo.git

源码下载:http://xiazai.jb51.net/201712/yuanma/CoreDataDemo(jb51.net).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Swift利用CoreData实现一个通讯录存储详解

    前言 相信大家对CoreData应该都不陌生,CoreData作为Apple的亲儿子,依然在App需要存储结构化数据上发挥着重要的作用.CoreData已经超过十年了,而且亲爹还在积极的维护着它. Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. 虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 Cor

  • Swift利用CoreData实现一个上班签到的小工具

    前言 我们在之前的两篇里面实现了一个十分简陋的通讯录,而且都是通过系统默认的方式创建的CoreData.可是实际中哪里有那么好的事情嘛,要是忘记在创建工程的时候勾选了下面这个图怎么办? 难道我们要把工程删除,再重新创建嘛?很多时候再开始工程的时候并特么的不知道需要用到数据库啊.更多的时候已经都开始敲代码了,连需求文档都还木有拿到手里,PM只会轻轻的说一句:设计图不是已经有了嘛,先画UI吧. 所以,CoreData Stack是为了解决这个问题诞生的嘛?很遗憾,并不是.看了前面的两篇文章之后,有木

  • Swift使用CoreData时遇到的一些填坑记录

    前言 最近在做一个 App 练手,其中用到了 CoreData 来存储用户的播放列表,由于 CoreData 这部分的文章还是比较少的,所以遇到了不少坑,所以写篇随笔记录一下. 题外话:可以给大家看看这个 App 的界面,我觉得还是挺清新的

  • Swift利用CoreData如何存储多种数据类的通讯录

    前言 我们在上一篇文章简单的实现了一个通讯录,说是通讯录实际上就只是一个简简单单的Name List.这次我们要往这个通讯录里面加入更多的元素,目的也是为了学习CoreData如何存储更多的数据类型.下面话不多说了,来随着小编一起看看详细的介绍吧. 完成后的效果: 1. CoreData支持存储数据类型 咦?这里面有两个好像很少看到的类型:Binary Data.Decimal.Transformable.这些都是神马东西? 1.1 Binary Data 顾名思义,就是二进制数据.对应到OC中

  • Joomla下利用configuration.php存储简单数据

    写入过程 复制代码 代码如下: // Get the path of the configuration file $fname = JPATH_CONFIGURATION.DS.'configuration.php'; // clear cache $cache = JFactory::getCache(); $cache->clean(); // Update the credentials with the new settings $config =& JFactory::getCo

  • Swift利用指纹识别或面部识别为应用添加私密保护功能

    前言 从最初做应用开始,我就密切关注用户的反馈和评论.有时他们的要求确实并不合理,但当大多数人提到一项功能时,就该我们做产品的人反思了. 私密保护功能是用户在评论中提到的,恰好像OneDay这样比较私密的内容确实可以增加这项功能. 指纹识别和面部识别虽然是两个很不相同的交互,但从开发的角度他们却只需要一套代码就可以搞定.在做之前我先解释下整个实现过程的重要环节: 原理图 1.我们需要一个数据来保存开关数据,在设置中心,用户根据喜好选择是否开启保护 2.一旦用户打开应用,通过判断是否保护来加载遮挡

  • Unity存储游戏数据的多种方法小结

    目录 1 PlayerPrefs: Unity自带的一种简单的键值存储系统 2 ScriptableObject: Unity中最灵活的数据管理工具 2.1 如何手动创建和修改数据文件 2.2 ScriptableObject优缺点总结 3 JSON: 轻量级的数据交换格式 3.1 序列化与反序列化 3.2 用JsonUtility对对象进行序列化和反序列化 4 XML:一种可扩展标记语言 5 三者特点总结 6 数据库:存储大量数据时使用的一种方法 1.安装SQLite插件 2.创建数据库和表

  • python利用xpath爬取网上数据并存储到django模型中

    帮朋友制作一个网站,需要一些产品数据信息,因为是代理其他公司产品,直接爬取代理公司产品数据 1.设计数据库 from django.db import models from uuslug import slugify import uuid import os def products_directory_path(instance, filename): ext = filename.split('.')[-1] filename = '{}.{}'.format(uuid.uuid4().

  • 分享一个安卓的内置多种工具类的Activity

    一个安卓的Activity,内置了多种工具类.要用的话,让自己的Activity继承这个Activity,各种方便,便于理解我在每个方法上都写了详细的注释,添加了网络部分,添加了表单文件一键上传 演示图 代码 void Call(java.lang.String number) 拨打=电话的方法 void download(java.lang.String url, NetResult result) 用于下载文件的函数 java.lang.String formatMemorySize(lon

  • 详解Swift 利用Opration和OprationQueue来下载网络图片

    详解Swift 利用Opration和OprationQueue来下载网络图片 1. 基于Opration封装的获取网络数据组件 import Foundation import UIKit public typealias OpreationClosure = ((_ data:Data? , _ error: Error?) -> Void) class LJOpreationManager: Operation { /** * 下载用的url */ public var imageUrl

随机推荐