xcode11上使用core Data

什么是Core Data

Core Data是一个方便的ORM框架。

本文主要会讲在Xcode11下Core Data的简单使用,并且以MVC框架的方式展示一个demo。

关于Core Data的原理不多说,边用边说

  1. 创建Single view app工程选择use core data
    在这里插入图片描述

  2. Datadb.xcdatamodeld中创建实体类

    在这里插入图片描述

3. 设置实体后生成创建管理对象子类(重要!)

在这里插入图片描述
只要一路next就行了,最后选择生成的目录。
会得到两个实体文件。在这里插入图片描述

  1. 新建一个Cocoa Touch class文件,继承NSObject作为Service处理表相关的逻辑。并对实体管理子类文件,整理得到如下文件目录结构
    在这里插入图片描述

  1. 编写service层
获得代理以及上下文

重点来了!先介绍下需要用到的对象!
NSManagedObjectContext:
这是连接你的应用程序和object model中间的另外一座桥梁,通过这个上下文,你可以实现增删改查等操作
而一个程序的上下文是在AppDelegate进行托管的,所以我们要拿到上下文,就要从AppDelegate中拿到。

	//获得当前程序的应用代理
    let appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate
    //通过应用代理对象,获得管理对象上下文
    let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

我们拿到上下文后就可以进行crud的实现了,下面是根据Person实体类实现的简单crud功能

CRUD实现

    func saveInfo(name: String, phone: String){
        //通过管理对象上下文,插入一条实体数据
        let person = NSEntityDescription.insertNewObject(forEntityName: "Person",
                                into: managedObjectContext) as! Person
        //设置实体的用户名属性的内容
        person.name = name
        //设置实体的密码属性的内容
        person.phone = phone
       
        appDelegate.saveContext()
        //在控制台打印输出日志
        print("Success to save data.")
    }
    
    func queryByname(name: String) -> Person{
        let fetch: NSFetchRequest<Person> = Person.fetchRequest()
        fetch.predicate = NSPredicate(format: "name=%@", name)
        let person = try? managedObjectContext.fetch(fetch)
        if let p = person?.first{
            return p
        }
        return Person()
    }
    
    func updateByname(name: String, phone: String) {
        let p = queryByname(name: name)
        p.phone = phone
        appDelegate.saveContext()
    }
    
    func deleteByname(name: String) {
        let p = queryByname(name: name)
        managedObjectContext.delete(p)
        appDelegate.saveContext()
    }

在这里插入图片描述

  1. 在storyboard上拖动控件,并为viewcontroller添加按钮响应事件。
//
//  ViewController.swift
//  Datadb
//
//  Created by hannibal lecter on 2020/6/19.
//  Copyright © 2020 com.cuit.ygl. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var lablePhone: UILabel!
    @IBOutlet weak var lableName: UILabel!
    @IBOutlet weak var inputPhone: UITextField!
    @IBOutlet weak var inputName: UITextField!
    
    var personservice = PersonService()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        //得到项目运行的路径,可以终端进入NSHomeDirectory/Library/Application Support/下查看sqlite文件
        print(NSHomeDirectory())
        
    }
    
    @IBAction func onsave(_ sender: UIButton) {
        let name = inputName.text!
        let phone = inputPhone.text!
        personservice.saveInfo(name: name, phone: phone)
        
    }
    @IBAction func onupdate(_ sender: UIButton) {
        personservice.updateByname(name: inputName.text!, phone: inputPhone.text!)
        let person = personservice.queryByname(name: inputName.text!)
        lableName.text = person.name
        lablePhone.text = person.phone
    }
    
    @IBAction func ondel(_ sender: UIButton) {
        personservice.deleteByname(name: inputName.text!)
    }
    
    @IBAction func onquery(_ sender: UIButton) {
        let person = personservice.queryByname(name: inputName.text!)
        lableName.text = person.name
        lablePhone.text = person.phone
    }
    
}

在这里插入图片描述
代码设计思路和参考的b站视频一致,设计思路和效果可到b站观看。

参考

  1. b站上的视频
  2. 博客园(作者的博客搞得太花里胡哨了,非常占资源!)

总结

  1. 可以通过print(NSHomeDirectory())得到sqllite的路径,然后从终端中对表进行管理
  2. 分层设计代码可以使逻辑更清晰

猜你喜欢

转载自blog.csdn.net/qq_39921637/article/details/106854112