- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Swift利用CoreData实现一个通讯录存储详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前言 。
相信大家对CoreData应该都不陌生,CoreData作为Apple的亲儿子,依然在App需要存储结构化数据上发挥着重要的作用。CoreData已经超过十年了,而且亲爹还在积极的维护着它.
Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象.
虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 。
Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型.
与SQLite区别:只能取出整个实体记录,然后分解,之后才能得到实体的某个属性.
在Monster、Indeed这些海外主流招聘网站看一下iOS的职位,基本上都会大大写着要求会熟练使用CoreData.
然而这么一个成熟,被实践检验过的代码库反而在国内使用并不是特别多。FMDB、Realm等等在被广泛使用。经常在面试的时候问iOSer是不是了解数据库,回答都是了解。再一细问,很多人也都是只使用到了FMDB,对于CoreData却是了解甚少.
后来想了想,可能是因为CoreData的入门成本有点高,而且相关的中文资料比较少的缘故吧.
为了写这个系列,还专门买来了objc.io的CoreData这本书。读完之后受益匪浅.
这个系列要写多少篇还没有想好,大概也还是会从基本到高级的一个过渡.
第一篇通过一个通讯录实现数据库的读取。第二篇会存储更多类型的数据.
最终实现结果:
1. Core Data架构 。
一个基本的 Core Data 栈由四个主要部分组成:托管对象 (NSManagedObject),托管对象上下文 (NSManagedObjectContext),持久化存储协调器 (NSPersistentStoreCoordinator),以及持久化存储 (NSPersistentStore).
关于Context想多说点,因为是天天都打交道的嘛。它其实是内存中的一块区域,对象所有的操作都需要一个context。直到save之前,都是在内存中,不会对数据库中的内容有任何影响。每一个托管对象都对应一个Context,一个对象只会跟一个特定的Context打交道。直到生命周期结束.
Context是线程不安全的.
2. CoreData的基本读取操作 。
2. 1 获取CoreData已经保存数据的五个步骤 。
2.2 基本存储 。
3. 更新一个通讯录的列表页Demo 。
好,接下来咱们来一步一步实现这个需求。为了突出重点,咱们先从最简单的开始,使用默认带数据库的工程进行着手.
3.1 Xcode创建默认带数据库的工程 。
在 Xcode 创建工程时,提供了创建 CoreData 的模板,只需要我们在创建时,勾选 CoreData 选项,Xcode 就会自动创建出数据模型文件.
这个Demo用这个创建,纯粹是为了简单直奔主题。不然还要一开始分享很多其他的内容,看官们会觉得腻的.
但是,实际开发中不建议使用这种方式创建。通常情况下我们都会把生成的模板代码都删除的.
3.2 创建本地数据库模板 。
勾选完成之后,会看到一个后缀名是"xcdatamodeld"的文件,这个就是咱们的数据库模板啦.
当然,现在里面是还不能存数据的,还需要我们设置一下字段名称.
第一步,要添加一个Entity,这个就相当于是数据库中的一张表.
第二步,对新建的Entity命名.
第三步,设计Entity里面的属性。咱们这个Demo的需求里面只需要一个人名,所以就只设置了一个名字叫做name的属性,类型是String.
其他更多的属性类型,我们会在下面一篇文章分享.
3.3 查询本地数据 。
咦?在最开始的不是说一个基本的 Core Data 栈由四个主要部分组成嘛?怎么没有看到呐?
来来来,这就是最开始我们使用Xcode创建默认带数据库的工程的原因。使用了这个选项,会自动的在AppDelegate中生成相应的代码。确实简化了咱们第一次学习的成本,但是就像没人会把所有代码都写在Controller里面一样,在APPDelegate也不会写这些东西.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
override func viewDidAppear(_ animated: Bool) {
super
.viewDidAppear(animated)
// 步骤一:获取总代理和托管对象总管
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedObectContext = appDelegate.persistentContainer.viewContext
// 步骤二:建立一个获取的请求
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName:
"Person"
)
// 步骤三:执行请求
do
{
let fetchedResults =
try
managedObectContext.fetch(fetchRequest) as? [NSManagedObject]
if
let results = fetchedResults {
people = results
tableView.reloadData()
}
}
catch
{
fatalError(
"获取失败"
)
}
}
|
3.4 插入并保存数据至本地数据库 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
private
func saveName(text: String) {
// 步骤一:获取总代理和托管对象总管
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedObectContext = appDelegate.persistentContainer.viewContext
// 步骤二:建立一个entity
let entity = NSEntityDescription.entity(forEntityName:
"Person"
, in: managedObectContext)
let person = NSManagedObject(entity: entity!, insertInto: managedObectContext)
// 步骤三:保存文本框中的值到person
person.setValue(text, forKey:
"name"
)
// 步骤四:保存entity到托管对象中。如果保存失败,进行处理
do
{
try
managedObectContext.save()
}
catch
{
fatalError(
"无法保存"
)
}
// 步骤五:保存到数组中,更新UI
people.append(person)
}
|
所有的源代码在这里 。
github地址:https://github.com/Stanbai/CoreDataDemo.git 。
总结 。
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://www.jianshu.com/p/3e793fca6a13 。
最后此篇关于Swift利用CoreData实现一个通讯录存储详解的文章就讲到这里了,如果你想了解更多关于Swift利用CoreData实现一个通讯录存储详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有办法在 .swift 文件(编译成 .swift 模块)中声明函数,如下所示: 你好.swift func hello_world() { println("hello world")
我正在尝试使用 xmpp_messenger_ios 和 XMPPFramework 在 iOS 上执行 MUC 这是加入房间的代码。 func createOrJoinRoomOnXMPP()
我想在我的应用程序上创建一个 3D Touch 快捷方式,我已经完成了有关快捷方式本身的所有操作,它显示正确,带有文本和图标。 当我运行这个快捷方式时,我的应用程序崩溃了,因为 AppDelegate
我的代码如下: let assetTag = Expression("asset_tag") let query2 = mdm.select(mdm[assetTag],os, mac, lastRe
我的 swift 代码如下所示 Family.arrayTuple:[(String,String)]? = [] Family.arrayTupleStorage:String? Family.ar
这是我的 JSON,当我读取 ord 和 uniq 数据时出现错误 let response2 : [String: Any] = ["Response":["status":"SUCCESS","
我想将 swift 扩展文件移动到 swift 包中。但是,将文件移动到 swift 包后,我遇到了这种错误: "Type 'NSAttributedString' has no member 'ma
使用CocoaPods,我们可以设置以下配置: pod 'SourceModel', :configurations => ['Debug'] 有什么方法可以用 Swift Package Manag
我正在 Xcode 中开发一个 swift 项目。我将其称为主要项目。我大部分都在工作。我在日期选择器、日期范围和日期数学方面遇到了麻烦,因此我开始了另一个名为 StarEndDate 的项目,其中只
这是 ObjectiveC 代码: CCSprite *progress = [CCSprite spriteWithImageNamed:@"progress.png"]; mProgressBar
我正在创建一个命令行工具,在 Xcode 中使用 Swift。我想使用一个类似于 grunt 的配置文件确实如此,但我希望它是像 Swift 包管理器的 package.swift 文件那样的快速代码
我假设这意味着使用系统上安装的任何 swift 运行脚本:#!/usr/bin/swift 如何指定脚本适用的解释器版本? 最佳答案 Cato可用于此: #!/usr/bin/env cato 1.2
代码说完全没问题,没有错误,但是当我去运行模拟器的时候,会出现这样的字样: (Swift.LazyMapCollection (_base:[ ] 我正在尝试创建一个显示报价的报价应用。 这是导入
是否可以在运行 Swift(例如 Perfect、Vapor、Kitura 等)的服务器上使用 RealmSwift 并使用它来存储数据? (我正在考虑尝试将其作为另一种解决方案的替代方案,例如 no
我刚开始学习编程,正在尝试完成 Swift 编程书中的实验。 它要求““编写一个函数,通过比较两个 Rank 值的原始值来比较它们。” enum Rank: Int { case Ace = 1 ca
在您将此问题标记为重复之前,我检查了 this question 它对我不起作用。 如何修复这个错误: error: SWIFT_VERSION '5.0' is unsupported, suppo
从 Xcode 9.3 开始,我在我的模型中使用“Swift.ImplicitlyUnwrappedOptional.some”包裹了我的字符串变量 我不知道这是怎么发生的,但它毁了我的应用程序! 我
这个问题在这里已经有了答案: How to include .swift file from other .swift file in an immediate mode? (2 个答案) 关闭 6
我正在使用 Swift Package Manager 创建一个应用程序,我需要知道构建项目的配置,即 Debug 或 Release。我试图避免使用 .xcodeproj 文件。请有人让我知道这是否
有一个带有函数定义的文件bar.swift: func bar() { println("bar") } 以及一个以立即模式运行的脚本foo.swift: #!/usr/bin/xcrun s
我是一名优秀的程序员,十分优秀!