- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章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已经保存数据的五个步骤 。
2.1.2 基本存储 。
2.2 多种类型的存储 。
1
2
3
4
5
6
|
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 帮我们解决了这个问题.
1
2
3
4
5
6
7
8
|
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://www.jianshu.com/p/a87d29610629 。
最后此篇关于Swift利用CoreData如何存储多种数据类的通讯录的文章就讲到这里了,如果你想了解更多关于Swift利用CoreData如何存储多种数据类的通讯录的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
按照我目前安排代码的方式,下一行将为各种托管对象上下文运行。一些获取的实体将具有“complededDate”,而其他实体将没有“completedDate”属性。 let task = retrie
我在 import CoreData 的应用程序委托(delegate)中遇到此错误。据我所知,这是因为我将一个项目命名为 coreData。但是我更改了项目的名称,然后将其删除,并且删除了 /Lib
我想将记录保存在数组中并从 CoreData 中删除它们。我尝试过使用 NSCopying 但似乎 copyWithZone 不适用于 NSManagedObject。我真的很困惑,任何帮助将不胜感激
有时我的项目中很少会出现错误(比如每第 100 个请求)。我的一些 CoreData 的请求有 data:我无法使用该数据。我真的不明白为什么会发生这种情况以及如何防止这种行为。 错误数据输出示例:
如果您使用 Xcode 创建一个新项目并告诉它在您创建项目时创建一个 CoreData 模板,则您不需要 #import 在使用 ManagedObjects 的类中。 我已经将 Core Data
我对 SQLCipher 数据库加密和 CoreData 有疑问:当我将持久存储协调器与 SQLCipher 一起使用时,它总是在第一次应用程序重新启动后因一对多关系故障而崩溃。因此,当我第一次启动该
我有一个想要添加 iCloud 支持的应用程序。此应用程序从服务器加载数据,并将数据存储在 CoreData 中,以便 NSFetchedResultsController可以管理UITableVie
我正在从 coredata 表 STUDENT 中获取数据,并使用 Array 在 tableview 中显示所有学生姓名。在选择任何一个学生姓名后(点击 tableViewCell),它会从另一个表
我在构建过程中收到以下错误。 “API 滥用:尝试序列化非拥有协调器上的存储访问(PSC = 0x7fb5ae208890,存储 PSC = 0x0)CoreData 为什么我的应用程序会出现 Cor
当将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 Ab
我的应用程序有两个选项卡栏...每个选项卡栏都将用户带到一个向他显示项目列表的 TableView Controller 。第一个 View 允许用户在数据库中记录条目。另一个选项卡/ View 从数
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省
我有一个名为visitDate的coredata属性 我想使用单独的选择器相互独立地设置日期和时间。 我意识到,当我设置时间时,我需要获取visitDate的现有日期、月份和年份,但只从NSDateP
我有这个代码示例演示如何更新核心数据中的对象,但是我遇到了一个小问题: // Retrieve the context if (managedObjectContext == nil) { m
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。 类似于:columnValue - someNumber(此数字由用户输入) 我知道我可能必须为此使用 N
有没有办法将 CoreData 模型文件(即实体描述:*.xcdatamodeld)导出到另一个项目。因为重新创建所有实体很无聊:-) 最佳答案 是的,只需将模型文件本身添加/复制到新项目中,就像任何
我使用核心数据编写了 iPhone 应用程序。当我在模拟器中运行应用程序时,它崩溃并出现以下错误: 2010-02-12 17:24:22.359 CrData[46122:4503] Unresol
我是 CoreData 的新手,在我的 iPhone 应用程序中,我想知道如何保存一些文本,然后将其重新加载。但诀窍是,当 UIDatePicker 中的日期与我相同时加载它。像日历一样保存它。 更新
我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询: 我有一个费用对象,它有一个费用金额字段。 费用可以链接到 ExpenseCategory 对象。 Expe
我在标题中使用“单例”一词时可能存在术语不正确的情况。我现在正在寻找一种好的技术。我有一个名为 user 的实体,它存储用户登录的数据,例如用于发出服务器请求的 session key 。我只希望这些
我是一名优秀的程序员,十分优秀!