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("测试读取")
手机扫一扫
移动阅读更方便
你可能感兴趣的文章