CoreData初级实战-Swift3.0

之前项目一直使用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?
}

初级的使用就介绍到这里~请期待后续使用方法

推荐阅读更多精彩内容