xcode11上使用core Data
作者:互联网
什么是Core Data
Core Data是一个方便的ORM框架。
本文主要会讲在Xcode11下Core Data的简单使用,并且以MVC框架的方式展示一个demo。
关于Core Data的原理不多说,边用边说
-
创建Single view app工程选择
use core data
-
在
Datadb.xcdatamodeld
中创建实体类
3. 设置实体后生成创建管理对象子类(重要!)
只要一路next
就行了,最后选择生成的目录。
会得到两个实体文件。
- 新建一个
Cocoa Touch class
文件,继承NSObject
作为Service处理表相关的逻辑。并对实体管理子类文件,整理得到如下文件目录结构
- 编写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()
}
- 在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站观看。
参考
总结
- 可以通过
print(NSHomeDirectory())
得到sqllite的路径,然后从终端中对表进行管理 - 分层设计代码可以使逻辑更清晰
标签:core,xcode11,name,person,text,phone,let,func,Data 来源: https://blog.csdn.net/qq_39921637/article/details/106854112