// 1. 建立模型文件
// 2. 建立CoreDataStack
// 3. 设置AppDelegate

接着

//
//  CoreDataStack.swift
//  CoreDataStackDemo
//
//  Created by wangbiao on 15/10/29.
//  Copyright © 2015年 wangbiao. All rights reserved.
//

import CoreDataclass CoreDataStack: NSObject {// MARK: - Properties
    let context: NSManagedObjectContextlet coordinator: NSPersistentStoreCoordinatorlet model: NSManagedObjectModellet store: NSPersistentStore?// MARK: - Singletonstatic func defaultStack() -> CoreDataStack {return instance}fileprivate static let instance = CoreDataStack()fileprivate override init() {// 构建托管对象模型let bundle = Bundle.mainlet modelURL = bundle.url(forResource: "Test", withExtension: "momd")!model = NSManagedObjectModel(contentsOf: modelURL)!// 构建持久化存储助理coordinator = NSPersistentStoreCoordinator(managedObjectModel: model)// 构建托管对象上下文,并且将助理连接到上下文context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)context.persistentStoreCoordinator = coordinator// 构建持久化存储let manager = FileManager.defaultlet urls = manager.urls(for: .documentDirectory, in: .userDomainMask)let documentsURL = urls.first!let storeURL = documentsURL.appendingPathComponent("Test")store = (try! coordinator.addPersistentStore(ofType: NSSQLiteStoreType,configurationName: nil, at: storeURL, options: nil))}// MARK: - Function
    func saveContext () {if context.hasChanges {do {try context.save()} catch {print("Save failed...")}}}
}

接着实现数据操作

//新增数据
func insertStudent(sno: String, name: String, score: Int) {// 获取上下文(也就是从”coreData基础“里面的那个类里面获取)let context = CoreDataStack.defaultStack().context// 构建实体对象let student = NSEntityDescription.insertNewObject(forEntityName: "Student",into: context) as! Student// 设置相关属性student.sno = snostudent.name = namestudent.score = score as NSNumber?}// 查询数据
    func fetchStudents() {// 获取上下文let context = CoreDataStack.defaultStack().context// 构建抓取请求let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")// 指定按照学号(sno)升序排列let sort = NSSortDescriptor(key: "sno", ascending: true,selector: #selector(NSString.localizedStandardCompare(_:)))request.sortDescriptors = [sort]// 构建查询条件
//        request.predicate = NSPredicate(format: "score > 60")
//        request.predicate = NSPredicate(format: "name like 'a*'")do {let students = (try context.fetch(request)) as! [Student]for student in students {print("\(student.sno!), \(student.name!), \(student.score!)")}} catch {print("Fetch failed...")}}// 统计信息
    func countStudents() {
//        // 1. 统计分数大于90的人数
//
//        // 获取上下文
//        let context = CoreDataStack.defaultStack().context
//
//        // 构建抓取请求
//        let request = NSFetchRequest(entityName: "Student")
//        request.predicate = NSPredicate(format: "score > 90")
//        request.resultType = .CountResultType
//
//        do {
//            let entries = (try context.executeFetchRequest(request))
//            let count = entries.first!.integerValue
//            print("Count: \(count)")
//        } catch {
//            print("Fetch failed...")
//        }// 2. 计算平均分数// 获取上下文let context = CoreDataStack.defaultStack().context// 构建抓取请求let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")request.resultType = .dictionaryResultType // 指定返回结果为字典// 构建表达式let description = NSExpressionDescription()description.name = "AverageScore"let args = [NSExpression(forKeyPath: "score")]description.expression = NSExpression(forFunction: "average:", arguments: args)description.expressionResultType = .floatAttributeType // 指定返回值类型// 将求平均值的表达式设置给request的属性request.propertiesToFetch = [description]do {let entries = (try context.fetch(request))let result = entries.first! as! NSDictionarylet averageScore = result["AverageScore"]!print("Average: \(averageScore)")} catch {print("Fetch failed...")}}// 修改数据
    func updateStudents() {// 获取上下文let context = CoreDataStack.defaultStack().context// 构建抓取请求let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")request.predicate = NSPredicate(format: "name like 'a*'")do {let students = (try context.fetch(request)) as! [Student]for student in students {student.score = 100}} catch {print("Fetch failed...")}// 保存
        CoreDataStack.defaultStack().saveContext()// 备注: 批量更新 & 异步操作 ???
    }// 删除数据
    func deleteStudents() {// 获取上下文let context = CoreDataStack.defaultStack().context// 构建抓取请求let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")request.predicate = NSPredicate(format: "score < 60")do {let students = (try context.fetch(request)) as! [Student]for student in students {context.delete(student)}} catch {print("Fetch failed...")}// 保存
        CoreDataStack.defaultStack().saveContext()}

总结:
增:
1:获取上下文
如:let context = CoreDataStack.defaultStack().context
2:构建实体对象
如:let student = NSEntityDescription.insertNewObject(forEntityName: "Student",
into: context) as! Student
3:设置相关属性
如: student.sno = sno
4:保存数据
如:CoreDataStack.defaultStack().saveContext()
 
修改,删除
1:获取上下文
2:构建抓取请求
如:let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Student")
3:给抓去请求设置相关属性吧
如:
//相当于给它设置约束
request.predicate = NSPredicate(format: "name like 'a*'")
// 指定返回结果为字典(修改,删除一般不用设置这个)
request.resultType = .dictionaryResultType
4:执行抓取操作
do {
let students = (try context.fetch(request)) as! [Student]
for student in students {
//修改如:student.score = 100
//删除如:context.delete(student)
}
} catch {
print("Fetch failed...")
}
5:保存数据
 
查询
1:获取上下文
2:构建抓取请求
3:指定按照学号(sno)升序排列(其实此部可以省略)
let sort = NSSortDescriptor(key: "sno", ascending: true,
selector: #selector(NSString.localizedStandardCompare(_:)))
request.sortDescriptors = [sort]
4:执行抓取语句
do {
let students = (try context.fetch(request)) as! [Student]
for student in students {
print("\(student.sno!), \(student.name!), \(student.score!)")
}
} catch {
print("Fetch failed...")
}
5:释放资源
 
统计
1:获取上下文
2:构建抓取请求
3:指定按照学号(sno)升序排列(其实此部可以省略)
let sort = NSSortDescriptor(key: "sno", ascending: true,
selector: #selector(NSString.localizedStandardCompare(_:)))
request.sortDescriptors = [sort]
4: 构建表达式(average是聚合函数,当然还有其他的)
如:let description = NSExpressionDescription()
description.name = "AverageScore"
let args = [NSExpression(forKeyPath: "score")]
description.expression = NSExpression(forFunction: "average:", arguments: args)
description.expressionResultType = .floatAttributeType // 指定返回值类型
5:将求平均值的表达式设置给request的属性
如request.propertiesToFetch = [description]
4:执行抓取语句
do {
let entries = (try context.fetch(request))
let result = entries.first! as! NSDictionary
let averageScore = result["AverageScore"]!
print("Average: \(averageScore)")
} catch {
print("Fetch failed...")
}
5:释放资源
 
当然,这个只是一个例子而已,不是所有的统计例子都要那么复杂的
如下面这个例子
// 1. 统计分数大于90的人数
//
// // 获取上下文
// let context = CoreDataStack.defaultStack().context
//
// // 构建抓取请求
// let request = NSFetchRequest(entityName: "Student")
// request.predicate = NSPredicate(format: "score > 90")
// request.resultType = .CountResultType
//
// do {
// let entries = (try context.executeFetchRequest(request))
// let count = entries.first!.integerValue
// print("Count: \(count)")
// } catch {
// print("Fetch failed...")
// }

转载于:https://www.cnblogs.com/LarryBlogger/p/6186655.html

coreData数据操作相关推荐

  1. numpy和torch数据操作对比

    对numpy和torch数据操作进行对比,避免遗忘. ndarray和tensor import torch import numpy as npnp_data = np.arange(6).resh ...

  2. Redis数据库搭建主从同步(主从概念、主从配置、主从数据操作)

    1. 主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读 ...

  3. 命令行客户端MySQL基本命令的使用(登录、登出、数据库操作的SQL语句、表结构的SQL语句、表数据操作的SQL语句)

    1. 登录和登出数据库 登录数据库: 输入下面命令: mysql -uroot -p 说明: -u 后面是登录的用户名  [写成-u root也是可以的] -p 后面是登录密码, 如果不填写, 回车之 ...

  4. MySQL基础篇:数据操作语言DML

    1.概述 数据操作语言(DML)用于插入.修改.删除.查询数据记录,包括以下SQL语句: INSERT:添加数据到数据库中 UPDATE:修改数据库中的数据 DELETE:删除数据库中的数据 2.插入 ...

  5. 逻辑模型三要素-数据操作

    数据操作是指对数据库中各种对象的实例或取值所允许执行操作的集合,其中包括操作方法及有关规则,它是对数据库动态特性的描述.

  6. 使用dplyr进行数据操作(30个实例)

    本文转载自"R语言",已获授权. dplyr软件包是R中功能最强大,最受欢迎的软件包之一.该软件包由最受欢迎的R程序员Hadley Wickham编写,他编写了许多有用的R软件包, ...

  7. Spring中集成ActiveRecordPlugin数据操作插件

    2019独角兽企业重金招聘Python工程师标准>>> ###Spring集成ActiveRecordPlugin数据操作插件 package com.yunhetong.mq.se ...

  8. MySQL:数据操作

    数据操作 一.输入数据 格式: mysql>INSERT INTO 数据表名 VALUES(输入数据); 例 mysql> INSERT INTO shujuleixing_xiaoshu ...

  9. 表操作,数据操作,单表查询,python操作数据库

    1.表操作 创建 create table 删除 drop table 查看表结构 desc 表/show create table 表 修改 alter table 表名 rename 新表名 al ...

最新文章

  1. 手把手教你用seq2seq模型创建数据产品(附代码)
  2. 机器学习项目失败的9个原因
  3. [python skill]利用python计算T分布下的置信区间
  4. IE6/7/8/9中Table/Select的innerHTML不能赋值
  5. pthread异步_探索 Flutter 异步消息的实现
  6. c语言如何输出斜杠星号,Excel 如何提取出最后一个斜杠开始的数字
  7. NodeJS使用ES6
  8. java readline 超时_跳过Java中的BufferedReader readLine()方法
  9. python基础入门--input标签、变量、数字类型、列表、字符串、字典、索引值、bool值、占位符格式输出...
  10. 马云妇女节寄语女性:没有败家的女人 只有爱家的女人
  11. 数据结构 4 字符匹配-KMP算法
  12. python代码怎么练_自己练习的Python代码(1)
  13. 使用 GO-CQHttp或mirai框架 搭建QQ的机器人
  14. openwrt添加SLM750模块驱动
  15. java连接打印机_JAVA连接打印机详解(有驱动,无驱动两种方式)
  16. 廉颇老矣?尚能饭否?64岁的Python之父被微软录取!
  17. 教你自己如何在Windows10系统创建虚拟专用网络
  18. 实战 | 如何利用 Scrapy 编写一个完整的爬虫!
  19. 日志采集系统都用到哪些技术?
  20. 永磁同步电机PMSM-比例谐振PR控制

热门文章

  1. GDCM:尝试修复损坏的J2K / DICOM的测试程序
  2. VTK:结构化网格之VisualizeStructuredGridCells
  3. VTK:绘图之AreaPlot
  4. VTK:相互作用之TrackballCamera
  5. C语言实现字符串匹配的Rabin-Karp算法(附完整源码)
  6. c++抽象类在多继承中的应用
  7. C++中什么时候用new[]申请,可以用delete释放
  8. 怎么用python扫描主机_python扫描主机开放的端口
  9. 1、代码中设置编码、编辑器中设置Python的编码
  10. WebLogic重启