Swift-Core Data(1) 基础存储
Swift-Core Data(2) 基础存储
最近有做个小 demo,有使用到 Core Data,才开始研究一下,把感觉比较有用的资料整理了一下。
1. Core Data 架构
一个基本的 Core Data 栈由四个主要部分组成:
1.1NSManagedObjectContext (托管对象上下文 )
日常打交道的都是这个。其他三个在数据迁移的时候才会看到。
作用:插入数据,查询数据,删除数据
1.2NSManagedObject(托管对象)
是我们的数据模型,也就是我们存储的对象。这些对象都保存在NSManagedObjectContext中,每个存储对象都知道自己对应哪个上下文。
作用:添加实体的属性,建立属性之间的关系
1.3NSPersistenStoreCoordinator (持久化存储协调器)
是模型和存储数据库之间的桥梁,负责两者之间最复杂的细节隐藏。
作用:设置数据存储的名字,位置,存储方式,和存储时机
1.4 NSPersistentStore(持久化存储)
Core Data 提供了四种类型,SQLite, Binary, XML, and In-Memory。在iOS的XML存储不可用,这些都是在持久存储的特征描述。所有的数据都存在这里。
- XML是将数据存为XML文件,只在 OS X 平台下可用。
- Binary的方法是存为一个Data文件。
- InMemory的方式是不会对数据进行真正意义上的持久化,全部存储在内存中,当应用程序退出时,数据也就消失了。
2.创建一个Core Data Demo
1.创建项目
创建 CoreData Demo.png在 Xcode 创建工程时,提供了创建 CoreData 的模板,只需要我们在创建时,勾选 CoreData 选项,Xcode 就会自动创建出数据模型文件。
这个Demo用这个创建,只是简单的开始了解 Coare Data。在今后的工作中不建议使用这种方式创建,通常情况下我们都会把生成的模板代码都删除,自己手写代码。
2. 创建本地数据库模板
数据库模板.png项目创建好,我们可以看到有一个.xcdatamodeld文件,这个就是咱们的数据库模板。
创建实体.png
然后点击.xcdatamodeld文件,添加实体,修改实体名字(必须大写字母开头),为实体添加属性(属性必须以小写字母开头)
对于每一个实体,build之后Xcode都会自动帮我们生成相应的实体类代码,如果不想要自动生成,可以选择手动生成,并且可以选择手动生成的语言,这里我们选择 Manual/None
手动生成的语言.png
手动和自动的选择.png
手动生成实体类代码的步骤:选择xcdatamodeld文件-->editor-->Create NSManagedObject SubClass,然后按提示点击就行了。最终你会在项目文件里面看到新生成的实体类代码文件
Create NSManagedObject SubClass.png
之后按照提示走就可以。创建完成后得结果:
结果.png
接下来就可以简单的使用了
3. 使用
这里只做了简单功能的使用,存储数据和查看数据,效果图如下: Simulator Screen Shot - iPhone 8 Plus - 2017-12-19 at 08.42.34.png3.1 存储数据
存储数据需要四步
1).获取总代理和托管对象托管对象上下文
2).创建实体,获取托管对象
3).将数据赋值给托管对象
4).保存到数据库
//第一步:获取总代理和托管对象托管对象上下文
let app = UIApplication.shared.delegate as? AppDelegate
let context = app?.persistentContainer.viewContext
//第二步:创建实体,获取托管对象
let entity = NSEntityDescription.entity(forEntityName: "Student", in: context!)
let student = NSManagedObject(entity: entity!, insertInto: context) as! Student
//第三步:将数据赋值给托管对象
student.name = self.nameTF.text
student.age = Int32(self.ageTF.text!)!
//第四步:保存到数据库。如果保存失败,进行处理
do {
try context?.save()
} catch {
fatalError("无法保存")
}
3.2 查询数据
查询数据需要三步
1).获取总代理和托管对象托管对象上下文
2).建立一个获取的请求
3).执行请求
//第一步:获取总代理和托管对象托管对象上下文
let app = UIApplication.shared.delegate as? AppDelegate
let context = app?.persistentContainer.viewContext
//第二步:建立一个获取的请求
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
//第三步:执行请求
do {
//[Student] 这个位置填的是获取对象的类型
//也可以使用 基类 NSManagedObject
let fetch = try context?.fetch(fetchRequest) as? [Student]
var resultStr:String = "查询结果\n"
for student in fetch! {
resultStr.append("name:\(student.name!) age:\(student.age) \n")
}
self.resultTextView.text = resultStr
} catch {
fatalError("无法查询")
}
这样简单的存储和查询功能就完成了 .GitHub Demo
网友评论