之前项目一直使用SQLite作为持久化方案,新项目打算用CoreData来练练手
Q:什么是CoreData?
苹果推出的一种数据持久化的方式,封装了数据库的操作过程,以及数据库中数据和OC对象的转换过程,让数据库的操作更加面向对象-
Q:为什么选择CoreData?
- 更加面向对象,符合编程思想,不需要解除SQLite代码
- 结构逻辑更加清晰,可视化
- 对关系复杂的持久化对象处理更加方便
- 新项目需要做持久化的数据不多,且存取次数一般,不需要太过考虑性能
Q:文章内容
CoreData的创建和初级使用,涉及增删改查,更高级的用法请看后面文章
实战
新建项目,记得勾选CoreData,后期再加入会比较麻烦,且会增加一些不必要的文件
创建
创建一个实体类,并添加属性,以城市为例,操作流程如图
城市实体类
系统或默认生成托管对象类文件,若无需特别配置则不用自己手动创建,若需手动创建则需先修改配置,否则会报文件重复错误
手动创建托管对象
然后创建相应的托管对象类文件,点击后缀名为.xcdatamodeld的模型文件,选择Xcode的Editor -> Create NSManagedObject Subclass -> 选择模型文件 -> 选择实体,生成实体对应的托管对象类文件
创建一个City类,属性与在CoraData中一样,然后将CoreData的操作封装成一个单利类来使用,具体代码如下
//
// VKYCoreDataTool.swift
//
// Created by SimonYHB on 2017/5/17.
// Copyright © 2017年 yhb. All rights reserved.
//
import UIKit
import CoreData
class VKYCoreDataTool: NSObject {
static let shared = VKYCoreDataTool.init()
lazy var app: AppDelegate = UIApplication.shared.delegate as! AppDelegate
func getContext()->NSManagedObjectContext {
if #available(iOS 10.0, *) {
let mycontext = app.persistentContainer.viewContext
return mycontext
} else {
let myContext = app.managedObjectContext
return myContext
}
}
//增加
func saveCitys(models:[VKYCityModel]?) {
let context = self.getContext()
models?.forEachEnumerated { (_, model) in
guard let city = NSEntityDescription.insertNewObject(forEntityName: "City", into: context) as? City else {
return
}
city.id = model.id
city.name = model.name
do {
try context.save()
} catch {
}
}
}
//查找
func queryCity(city:String,finishBlocl:(String?)->()) {
let context = self.getContext()
//声明数据的请求
let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest()
fetchRequest.fetchLimit = 1 //限制查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量
//声明一个实体结构
let EntityName = "City"
let entity:NSEntityDescription? = NSEntityDescription.entity(forEntityName: EntityName, in: context)
fetchRequest.entity = entity
//设置查询条件
let predicate = NSPredicate.init(format: "name = %@", city)
fetchRequest.predicate = predicate
//查询操作
do{
let fetchedObjects = try context.fetch(fetchRequest) as! [City]
//遍历查询的结果
for info:City in fetchedObjects{
finishBlocl(info.id!)
}
}catch {
let nserror = error as NSError
finishBlocl(nil)
fatalError("查询错误: \(nserror), \(nserror.userInfo)")
}
}
//删除全部
func deleteCityData(){
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "City")
let context = self.getContext()
do{
let rels = try context.fetch(request) as! [NSManagedObject];
for rel in rels{
context.delete(rel)
}
try context.save()
}catch{
fatalError();
}
}
}
class VKYCityModel: NSObject {
var name: String?
var id: String?
}
初级的使用就介绍到这里~请期待后续使用方法