【Swift】CoreData的使用
CoreData只是iOS数据持久化的其中一个方法,所有数据持久化如下
1、plist文件(属性列表),通常用于储存用户设置,也zhi可以用于存储捆绑的信息;
2、preference(偏好设置),常用于保存少量数据;
3、NSKeyedArchiver(归档),将内存中的对象实例保存成binary到磁盘并且可以逆向这个过程用来保存用户操作状态等;
4、SQLite 3,使用数据库进行存储;
5、CoreData,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
在新建项目时,把Use Core Data勾上
如果你创建时没勾,可以参考别人的博客,自己手动添加

由于我勾选了Use Core Data,系统帮我生成了后缀为【xcdatamodeld】的档案
单击进入后,先创建实体(添加实体),然后添加属性,最后为属性设置需要存储的类型(Type)
这里我为此实体(MyTest),添加唯一的属性testSaveInt,类型为Int(Integer 16)
我这里只添加唯一属性,这里额外推荐一篇很棒的博客,除了多属性,里面还有提到属性关联,这个属性被删了,会影响到别的东西
具体在他写的【四、逻辑与建模】,仔细看完他列举的情景,就明白我在说什么了,不过他是用objective-c写的,有点遗憾

接着创建一个NSManagedObject子类(点击Editor -> Create NSmanagedObject Subclass...)
然后先选择自己的项目(当初开始写app时,创建的项目名称)
最后再勾选刚刚创建的实体"MyTest"

创建完后,多出两个档案,分别是
MyTest+CoreDataClass.swift
MyTest+CoreDataProperties.swift(这个不用修改,它的作用是存放你刚刚添加的属性,例如前面的testSaveInt)
我们在【MyTest+CoreDataClass.swift】添加自己封装的方法,后续可以通过类的对象,来访问此类的一些函数
以下的代码,是对 Int 类型的变量 testSaveInt,做增删改查的动作,具体流程如下
1、使用【增】的方法,写入数据12
2、使用【查】的方法,查询资料库是否有数据(for循环检验:有无用MyTest这个实体创建的资料库?)
3、使用【改】的方法,找出实体"MyTest"里,数据为12的Int,更改为38
4、使用【查】的方法,查询数据是否被改变(假设第2步是成功的)
5、使用【删】的方法,资料库内,发现testSaveInt == 38 的,立刻删除
6、使用【查】的方法,看看资料库内,是否都不存在数据了
import UIKit // 把这行加上
import Foundation
import CoreData @objc(MyTest)
public class MyTest: NSManagedObject { // 获取context
func getContext() -> NSManagedObjectContext {
let mDelegate = UIApplication.shared.delegate as! AppDelegate
return mDelegate.persistentContainer.viewContext
} // MARK: - 【增】的功能
func coreDataAdd(command: String) {
switch command {
case "测试写入":
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext let newTest = NSEntityDescription.insertNewObject(forEntityName: "MyTest", into: mContext)as! MyTest newTest.testSaveInt = 12 mDelegate.saveContext()
default:
break
}
} // MARK: - 【删】的功能
func coreDataDelete(command: String) {
switch command {
case "测试删除":
// 获取上下文
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext // 设置查询的实体,此处的实体是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext) // 请求实体(Fetch:取、拿来)
let request = NSFetchRequest<MyTest>()
request.entity = entity do {
let results:[AnyObject]? = try mContext.fetch(request) for myTest in results as![MyTest] {
if myTest.testSaveInt == 38 {
mContext.delete(myTest)
mDelegate.saveContext()
}
}
} catch {
print("删除数据失败")
}
default:
break
}
} // MARK: - 【改】的功能
func coreDataUpdate(command: String) {
switch command {
case "测试修改":
// 获取上下文
let mDelegate = UIApplication.shared.delegate as! AppDelegate
let mContext = mDelegate.persistentContainer.viewContext // 设置查询的实体,此处的实体是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext) // 请求实体(Fetch:取、拿来)
let request = NSFetchRequest<MyTest>()
request.entity = entity do {
let results:[AnyObject]? = try mContext.fetch(request) for myTest in results as![MyTest] {
if myTest.testSaveInt == 12 {
myTest.testSaveInt = 38
mDelegate.saveContext()
}
}
} catch {
print("修改数据失败")
} default:
break
}
} // MARK: - 【查】的功能
func coreDataSearch(command: String) {
switch command {
case "测试读取":
// 获取上下文
let mContext = getContext() // 设置查询的实体,此处的实体是MyTest
let entity = NSEntityDescription.entity(forEntityName: "MyTest", in: mContext) // 请求实体(Fetch:取、拿来)
let request = NSFetchRequest<MyTest>()
request.entity = entity do {
let results:[AnyObject]? = try mContext.fetch(request) for myTest in results as![MyTest] {
print("value=\(myTest.testSaveInt)")
}
} catch {
print("读取数据失败")
} default:
break
}
}
}
最终,在需要执行【数据持久化】的类,写上常量的申请(类的对象)
let classCoreData: MyTest = MyTest()
然后就可以用以下代码,愉快的调用了
classCoreData.coreDataAdd("测试写入")
classCoreData.coreDataDelete("测试删除")
classCoreData.coreDataUpdate("测试修改")
classCoreData.coreDataSearch("测试读取")
【Swift】CoreData的使用的更多相关文章
- Step by Step Do IOS Swift CoreData Simple Demo
简单介绍 这篇文章记录了在 IOS 中使用 Swift 操作 CoreData 的一些基础性内容,因为缺乏文档,基本上都是自行实验的结果.错漏不可避免,还请谅解. 部分内容借鉴了 Tim Roadle ...
- iOS CoreData 增删改查详解
最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...
- Swift基础之CoreData的使用
以前使用过OC版本的CoreData应该很好理解Swift方式,所以这里简单的展示一下,增删改查的方法使用,同时给大家说一下创建步骤,方便大家的使用,转载请注明出处,谢谢~ 步骤一:创建一个Swift ...
- [Swift]创建CoreData的两种方式
一.CoreData介绍 CoreData主要分为两部分: 上层是模型层,模型层有NSManagedObjectContext上下文管理着, 底层则是由SQLite实现的持久化部分,通过NSPersi ...
- SWIFT 之CoreData初试
SWIFT中使用CoreData来保存本地数据,在建立项目的时候把 "Use Core Data"选项选上 项目建立完成后点击后缀为 .xcdatamodeld的那个文件,点击右下 ...
- [Swift通天遁地]七、数据与安全-(4)CoreData数据的增、删、改、查
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- iOS开发——数据持久化Swift篇&(四)CoreData
CoreData import CoreData class ViewController: UIViewController { override func viewDidLoad() { supe ...
- Swift下CoreData的使用
我之前的随笔中有写过一些iOS持久化存储的方法,包含了sqlite.解归档.沙盒存放等等.这些方式中,能够大规模存储,并保持性能的只有使用sqlite了.而这里将记录下Cocoa自身继承的数据库的存储 ...
- 【swift】CoreData Crash(崩溃)(Failed to call designated initializer on NSManagedObject class)
感谢另一篇博客:https://blog.csdn.net/devday/article/details/6577985 里面的图片和介绍,发现问题如他描述的一样,没有bundle 我的Xcode版本 ...
随机推荐
- jQuery中onload与ready区别
onload和ready的区别document.ready和onload的区别为:加载程度不同.执行次数不同.执行速度不同.1.加载程度不同 document.ready:是DOM结构绘制完毕后就执行 ...
- 从0到1搭建自己的组件(vue-code-view)库(下)
0x00 前言 书接上文,本文将从源码功能方面讲解下 vue-code-view 组件核心逻辑,您可以了解以下内容: 动态组件的使用. codeMirror插件的使用. 单文件组件(SFC,singl ...
- 计算机网络-3-2-点对点协议PPP
点对点协议PPP 在通信链路较差的年代,在数据链路层使用可靠传输协议曾经是一种好方法,比较简单的点对点PPP协议则是目前使用最广泛的数据链路层协议. PPP协议的特点 互联网用户通过都要连接到某个IS ...
- sql注入理解
一.SQL注入产生的原因和危害 1.原因 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序.而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原 ...
- 攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup
攻防世界 WEB 高手进阶区 TokyoWesterns CTF shrine Writeup 题目介绍 题目考点 模板注入 Writeup 进入题目 import flask import os a ...
- 快速排序--洛谷卡TLE后最终我还是选择了三向切割
写在前边 这篇文章呢,我们接着聊一下排序算法,我们之前已经谈到了简单插入排序 和ta的优化版希尔排序,这节我们要接触一个更"高级"的算法了--快速排序. 在做洛谷的时候,遇到了一道 ...
- ant生成jmeter测试报告没有数据【已解决】
1.如下图,在配置build时,到网上找配置文件,配置样式表文件名经常是jmeter-results-detail-report_21.xsl, 3.但是在其他版本可能被不是这个文件名,在jmeter ...
- Python - 一行代码查看当前操作系统默认的编码标准
一句代码 在 cmd 中执行 > python3 -c 'import locale; print(locale.getpreferredencoding())' UTF-8
- 设计模式学习-使用go实现适配器模式
适配器模式 定义 代码实现 优点 缺点 适用范围 代理.桥接.装饰器.适配器4种设计模式的区别 参考 适配器模式 定义 适配器模式的英文翻译是Adapter Design Pattern.顾名思义,这 ...
- 设计模式学习-使用go实现外观模式
外观模式 定义 适用范围 代码实现 优点 缺点 关于接口粒度的思考 参考 外观模式 定义 外观模式也叫门面模式 外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接 ...