一、介绍

CoreData不像slqite3那样编写代码繁琐,同时避免了使用了SQL语句的麻烦,也可以回避使用C语言的语法,降低了iOS开发的技术门槛。

CoreData可降低开发成本,提高代码质量。它是一个完全面向对象的API,能够合理管理内存,负责在数据库中存储数据,底层也是由类似

于SQL的技术实现的。CoreData是持久化存储的最佳方式,数据最终的存储类型可以是SQLite数据库、XML、二进制、内存或自定义数据类型

它和SQLite的区别是:只能取出整个实体记录,然后分离,之后才能得到实体的某个属性。

二、注意

Swift3.0中CoreData使用有了很大的变动,如下:

1、生成的AppDelegate类中关于CoreData的代码更少了

2、创建Entity实体后,再创建对应的类,找不到NSManageredObject这个文件,解决办法如下操作

(1)创建实体,添加属性

(2)创建对相应的类,只有Data Model和Mapping Model,却找不到NSManageedObject

(3)从工具栏Editor创建NSManagedObject

3、创建出的对应得实体类是分类

三、好了,创建完毕后,现在开始进行CoreData的操作了,这里我创建了工具类HandleCoreData,专门用来操作CoreData的,提供类方法。

(1)插入数据

//1、插入数据的具体操作如下
/*
* 通过AppDelegate单利来获取管理的数据上下文对象,操作实际内容
* 通过NSEntityDescription.insertNewObjectForEntityForName方法创建实体对象
* 给实体对象赋值
* 通过saveContext()保存实体对象
*/
class func insertData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //创建user对象
let EntityName = "User"
let oneUser = NSEntityDescription.insertNewObject(forEntityName: EntityName, into:context) as! User //对象赋值
oneUser.userID =
oneUser.userEmail = "12345@163.com"
oneUser.userPwd = "" //保存
app.saveContext()
}

(2)查询数据

//2、查询数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 使用查询出来的数据
*/
class func queryData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
print("userID = \(info.userID)")
print("userEmail = \(info.userEmail)")
print("userPwd = \(info.userPwd)")
print("+++++++++++++++++++++++++")
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
}

(3)修改数据

//3、修改数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 将查询出来的数据进行修改,也即进行赋新值
* 通过saveContext()保存修改后的实体对象
*/
class func updateData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
//修改邮箱
info.userEmail = "xyq@163.com" //重新保存
app.saveContext()
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
}

(4)删除数据

//4、删除数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 通过context.delete删除查询出来的某一个对象
* 通过saveContext()保存修改后的实体对象
*/
class func deleteData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
//删除对象
context.delete(info) //重新保存
app.saveContext()
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
}

操作CoreData完整的代码如下:

//
// HandleCoreData.swift
// XYQCoreData
//
// Created by 夏远全 on 2017/2/25.
// Copyright © 2017年 夏远全. All rights reserved.
// import UIKit
import CoreData //User对象创建成功之后,接下来就是通过对象来使用CoreData了
class HandleCoreData: NSObject { //1、插入数据的具体操作如下
/*
* 通过AppDelegate单利来获取管理的数据上下文对象,操作实际内容
* 通过NSEntityDescription.insertNewObjectForEntityForName方法创建实体对象
* 给实体对象赋值
* 通过saveContext()保存实体对象
*/
class func insertData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //创建user对象
let EntityName = "User"
let oneUser = NSEntityDescription.insertNewObject(forEntityName: EntityName, into:context) as! User //对象赋值
oneUser.userID =
oneUser.userEmail = "12345@163.com"
oneUser.userPwd = "" //保存
app.saveContext()
} //2、查询数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 使用查询出来的数据
*/
class func queryData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
print("userID = \(info.userID)")
print("userEmail = \(info.userEmail)")
print("userPwd = \(info.userPwd)")
print("+++++++++++++++++++++++++")
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
} //3、修改数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 将查询出来的数据进行修改,也即进行赋新值
* 通过saveContext()保存修改后的实体对象
*/
class func updateData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
//修改邮箱
info.userEmail = "xyq@163.com" //重新保存
app.saveContext()
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
} //4、删除数据的具体操作如下
/*
* 利用NSFetchRequest方法来声明数据的请求,相当于查询语句
* 利用NSEntityDescription.entityForName方法声明一个实体结构,相当于表格结构
* 利用NSPredicate创建一个查询条件,并设置请求的查询条件
* 通过context.fetch执行查询操作
* 通过context.delete删除查询出来的某一个对象
* 通过saveContext()保存修改后的实体对象
*/
class func deleteData(){ //获取数据上下文对象
let app = UIApplication.shared.delegate as! AppDelegate
let context = app.persistentContainer.viewContext //声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = //限制查询结果的数量
fetchRequest.fetchOffset = //查询的偏移量 //声明一个实体结构
let EntityName = "User"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity //设置查询条件
let predicate = NSPredicate.init(format: "userID = '2'", "")
fetchRequest.predicate = predicate //查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [User] //遍历查询的结果
for info:User in fetchedObjects{
//删除对象
context.delete(info) //重新保存
app.saveContext()
}
}catch {
let nserror = error as NSError
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
}
}

swift3.0:CoreData的使用的更多相关文章

  1. swift3.0 coredata 的使用

    //swift3.0在语法上有很大的改变,以简单的增删改查为例,如下: //User类如下: import Foundation import CoreData extension User { @n ...

  2. swift3.0 coreData的使用-日记本demo

    效果 需求分析 基于官方MasterDetail模板,官方写了很多复杂的coredata逻辑,在此基础上快速开发简单的日记本程序. - 主要功能:增.删.改.查 - 界面用默认的界面,将detail页 ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)

    本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...

  5. Swift3.0变化分享

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  6. swift3.0变化总结

    Swift 3.0 做出的改变很大,在这篇文章中,我将尽我所能,利用代码样例给大家解释Swift 3.0最重要(要命)的改变,希望大家能够做好升级Swift 3.0 的准备.Swift 3.0的改变不 ...

  7. 关于for循环------swift3.0

    在程序开发当中,for循环使用的频率无疑是最高的.常用的swift循环是递增式遍历.当然各种循环,swift都能办到.但其大多采用关键字形式实现,大部分开发者更喜欢直接使用C式循环代码.在swift3 ...

  8. Swift2.3 --> Swift3.0 的变化

    Swift3.0语法变化 首先和大家分享一下学习新语法的技巧: 用Xcode8打开自己的Swift2.3的项目,选择Edit->Convert->To Current Swift Synt ...

  9. Swift3.0都有哪些变化

    从写第一篇Swift文章的时候到现在Swift已经从1.2发展到了今天的3.0,这期间由于Swift目前还在发展阶段并不能向下兼容,因此第一篇文章中的部分代码在当前的Xcode环境中已经无法运行.在W ...

随机推荐

  1. 使用React Hooks新特性useReducer、useContext替代传统Redux高阶组件案例

    当我们使用redux进行数据管理的时候,一般都是在根组件通过Provider的方式引入store,然后在每个子组件中,通过connect的方式使用高阶组件进行连接,这样造成的一个问题是,大量的高阶组件 ...

  2. fatal error C1060:compiler is out of heap space

    今天svn update了下代码,rebuild工程的时候报错: fatal error C1060:compiler is out of heap space 意思是说编译器堆内存不足 百度结果:V ...

  3. View 事件分发

    View 事件分发 学习自 <Android开发艺术探索> 官方文档-MotionEvent 事件分发机制漫谈 View的事件分发机制,使我们了解View的工作原理继而学习如何自定义Vie ...

  4. 网络与多线程---OC中多线程使用方法(一)

    小编在此之前,通过一个小例子,简单的形容了一下进程与线程之间的关系,现在网络编程中的多线程说一下!!! *进程的基本概念 每一个进程都是一个应用程序,都有自己独立的内存空间,一般来说一个应用程序存在一 ...

  5. Good Bye 2016 F.New Year and Finding Roots(交互)

    题目链接 \(Description\) 有一棵高度为\(h\)的满二叉树,点从\(1\)到\(2^h-1\)编号(无序).每次你可以询问一个点的编号,交互库会返回其所有邻接点的编号.你需要在\(16 ...

  6. (android高仿系列)今日头条 --新闻阅读器 (转载)

    非常不错,原文地址:http://blog.csdn.net/vipzjyno1/article/details/26514543

  7. 【BZOJ-4408】神秘数 可持久化线段树

    4408: [Fjoi 2016]神秘数 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 475  Solved: 287[Submit][Status ...

  8. 微服务架构的分布式事务解决方案 - zhaorui2017的博客 - CSDN博客

    微服务架构的分布式事务解决方案 - zhaorui2017的博客 - CSDN博客   http://blog.csdn.net/zhaorui2017/article/details/7643679 ...

  9. 【来龙去脉系列】深入理解DIP、IoC、DI以及IoC容器

    摘要 面向对象设计(OOD)有助于我们开发出高性能.易扩展以及易复用的程序.其中,OOD有一个重要的思想那就是依赖倒置原则(DIP),并由此引申出IoC.DI以及Ioc容器等概念.通过本文我们将一起学 ...

  10. 使用position:relative制作下边框下的小三角

    在制作tab选项卡的时候,有时会有下边框,且下边框下另一个头向下的小三角,这全然能够用css来实现,而不必使用背景图片. 由于使用背景图片时会有一个问题,选项卡内容字数不同.导致使用背景图片时无法控制 ...