(Xcode 8.1 )CoreData 的使用

近日,把Xcode升级 8.1 之后,感觉变化好大. 这篇文章主要介绍CoreData 的使用.由于笔者对此认知有限,不正确的地方还请指正,感谢!

使用之前一定要导入 import CoreData 类

先来介绍几个要使用的对象
/*()括号里的内容为自己的理解*/
1、NSManagedObjectContext 管理对象,上下文,持久性存储模型对象
2、NSManagedObjectModel 被管理的数据模型(通过路径加载coreData模型,可以映射到数据库里),数据结构
3、NSPersistentStoreCoordinator 连接数据库的(持久化存储协调器  让 模型 和 数据库发生关系)
4、NSManagedObject 被管理的数据记录
5、NSFetchRequest 数据请求
6、NSEntityDescription 表格实体结构
创建过程
(Xcode 8.1 )CoreData 的使用_第1张图片
coreData第一步.jpg
(Xcode 8.1 )CoreData 的使用_第2张图片
coreDataDemo第二步.jpg
(Xcode 8.1 )CoreData 的使用_第3张图片
CoreDataDemo第三步.jpg
(Xcode 8.1 )CoreData 的使用_第4张图片
coreDataDemo 第四步.jpg
(Xcode 8.1 )CoreData 的使用_第5张图片
coreDataDemo 第五步.jpg
经过上面的操作,就可以直接进行代码编写了(Xcode 8.1 为我们自动创建了下面两步, 所以我们就不用去创建了)
(Xcode 8.1 )CoreData 的使用_第6张图片
省略掉的 第一步.png
(Xcode 8.1 )CoreData 的使用_第7张图片
省略掉的 第二步.png
使用之前的准备工作

实现的效果 有四个按钮分别是: 添加数据 / 删除数据 / 修改数据 / 查找数据. 有一个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.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.init(entityName: "Student")
        // 查询条件
        let predicate = NSPredicate.init(format: "name like %@", "*\(nameTextFiled.text!)*")
        // 让请求带上条件
        request.predicate = predicate
        dataArr = try! content.fetch(request) as! [Student]
        tableView.reloadData()
    }
以上代码使用的是swift 3.0

你可能感兴趣的:((Xcode 8.1 )CoreData 的使用)