近日,把Xcode升级 8.1 之后,感觉变化好大. 这篇文章主要介绍CoreData 的使用.由于笔者对此认知有限,不正确的地方还请指正,感谢!
使用之前一定要导入 import CoreData 类
先来介绍几个要使用的对象
/*()括号里的内容为自己的理解*/
1、NSManagedObjectContext 管理对象,上下文,持久性存储模型对象
2、NSManagedObjectModel 被管理的数据模型(通过路径加载coreData模型,可以映射到数据库里),数据结构
3、NSPersistentStoreCoordinator 连接数据库的(持久化存储协调器 让 模型 和 数据库发生关系)
4、NSManagedObject 被管理的数据记录
5、NSFetchRequest 数据请求
6、NSEntityDescription 表格实体结构
创建过程





经过上面的操作,就可以直接进行代码编写了(Xcode 8.1 为我们自动创建了下面两步, 所以我们就不用去创建了)


使用之前的准备工作
实现的效果 有四个按钮分别是: 添加数据 / 删除数据 / 修改数据 / 查找数据. 有一个tableView 来展示查询 增加 删除 查找 数据, 用dataArr 作为 tableView 的数据源
首先有一个数据接收者
var dataArr = [Student]()
// 被管理对象上下文
let content = NSManagedObjectContext.init(concurrencyType: NSManagedObjectContextConcurrencyType.mainQueueConcurrencyType)
// coreData 模型的路径
let path = Bundle.main.path(forResource: "Person", ofType: "momd") // 注意是"momd"
// 通过路径加载coreData模型(可以映射到数据库里)
let model = NSManagedObjectModel.init(contentsOf: URL.init(fileURLWithPath: path!))!
// 持久化存储协调器 (让模型 和 数据库发生关系)
let coordinator = NSPersistentStoreCoordinator.init(managedObjectModel: model)
// 数据库路径
let sqlPath = NSHomeDirectory() + "/Documents/Person.sqlite"
// 通过协调器设置数据的存储方法
try! coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: URL.init(fileURLWithPath: sqlPath), options: nil)
// 将协调器设置给上下文, 从此上下文就拥有了权利(增删改查)
content.persistentStoreCoordinator = coordinator
/***************准备工作完成*************************/
// 构造查询请求, 需要设置在哪个表里查询, 如果不设置查询条件, 默认查询所有
let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
do{
// 执行查询请求, 并且错误处理
dataArr = try content.fetch(request) as! [Student]
}catch{
print("查询所有, 失败了")
}
添加按钮代码
@IBAction func addBtn(_ sender: UIButton) {
self.view.endEditing(true) // 开启键盘
if nameTextFiled.text == "" || ageTextField.text == "" {
print("新增时不能为空")
return
}
print("新增")
// 新增一条数据, 返回值就是这个数据的指针
let model = NSEntityDescription.insertNewObject(forEntityName: "Student", into: content) as! Student
// 设置数据的字段信息
model.name = nameTextFiled.text
let ageStr = ageTextField.text! as NSString
model.age = Int16(NSNumber.init(integerLiteral: ageStr.integerValue))
// 保存, 并进行错误处理
do {
try content.save()
dataArr.append(model)
nameTextFiled.text = ""
ageTextField.text = ""
tableView.reloadData()
} catch {
print("新增失败")
}
}
删除按钮代码
@IBAction func deleteBtn(_ sender: Any) {
if currentRow < 0 {
print("先选中, 再删除")
return
}
print("删除")
//找到需要删除的数据
let model = dataArr[currentRow]
// 删除
content.delete(model)
//保存数据, 并且进行错误处理
do {
try content.save()
dataArr.remove(at: currentRow)
tableView.reloadData()
} catch {
print("删除出问题")
}
}
修改按钮代码
@IBAction func updateBtn(_ sender: Any) {
if nameTextFiled.text == "" || ageTextField.text == "" || currentRow < 0 {
print("修改条件不足")
return
}
print("修改")
// 找到删除的数据
let model = dataArr[currentRow]
// 修改它
model.name = nameTextFiled.text
let ageStr = ageTextField.text! as NSString
model.age = Int16(NSNumber.init(integerLiteral: ageStr.integerValue))
// 保存
do {
try content.save()
tableView.reloadData()
} catch {
print("修改失败")
}
}
查询按钮代码
@IBAction func findBtn(_ sender: UIButton) {
// 请求对象
let request = NSFetchRequest<NSFetchRequestResult>.init(entityName: "Student")
// 查询条件
let predicate = NSPredicate.init(format: "name like %@", "*\(nameTextFiled.text!)*")
// 让请求带上条件
request.predicate = predicate
dataArr = try! content.fetch(request) as! [Student]
tableView.reloadData()
}
网友评论