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

接着

//
// CoreDataStack.swift
// CoreDataStackDemo
//
// Created by wangbiao on 15/10/29.
// Copyright © 2015年 wangbiao. All rights reserved.
// import CoreData class CoreDataStack: NSObject {
// MARK: - Properties
let context: NSManagedObjectContext
let coordinator: NSPersistentStoreCoordinator
let model: NSManagedObjectModel
let store: NSPersistentStore? // MARK: - Singleton
static func defaultStack() -> CoreDataStack {
return instance
} fileprivate static let instance = CoreDataStack() fileprivate override init() {
// 构建托管对象模型
let bundle = Bundle.main
let 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.default
let 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 = sno
student.name = name
student.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! NSDictionary
let 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 =
}
} 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...")
// }

coreData数据操作的更多相关文章

  1. MagicalRecord 多表关联数据操作

    最近在使用MagicalRecord做数据持久层CoreData的操作库,今天做了一个多表关联数据的操作,整理了一个demo,特此记录一下. 关于如何使用Cocopads 和 MagicalRecor ...

  2. iOS数据库操作之coredata详细操作步骤

    CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/ ...

  3. [Swift通天遁地]七、数据与安全-(4)CoreData数据的增、删、改、查

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. StackExchange.Redis帮助类解决方案RedisRepository封装(字符串类型数据操作)

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/tag/NoSql/ 目录 一.基础配置封装 二.String字符串类型数据操作封 ...

  5. hive数据操作

    mdl是数据操作类的语言,包括向数据表加载文件,写查询结果等操作 hive有四种导入数据的方式 >从本地加载数据 LOAD DATA LOCAL INPATH './examples/files ...

  6. Dapper 数据操作框架

    数据操作DapperFrom NuGet:Install-Package DapperorInstall-Package Dapper.StrongName微型ORM:PetaPoco获得PetaPo ...

  7. Django数据操作F和Q、model多对多操作、Django中间件、信号、读数据库里的数据实现分页

    models.tb.objects.all().using('default'),根据using来指定在哪个库里查询,default是settings中配置的数据库的连接名称. 外话:django中引 ...

  8. Entity Framework 5.0系列之数据操作

    Entity Framework将概念模型中定义的实体和关系映射到数据源,利用实体框架可以将数据源返回的数据具体化为对象:跟踪对象所做的更改:并发处理:将对象更改传播到数据源等.今天我们就一起讨论如何 ...

  9. 数据操作语言DML与运算符

    数据操作语言DML(添加,修改,删除) 1.添加数据 insert into insert into 表名 (字段列表) values (值列表),值列表要和字段列表按顺序匹配. insert int ...

随机推荐

  1. linux基础1——网络配置入门

    1.IP地址配置 (1)临时IP更改 sudo ifconfig eth0 down    暂停接口 sudo ifconfig eth0 192.168.1.xx sudo ifconfig eth ...

  2. 向架构师进军-->可重用架构资源

    如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 软件架构有三个主要来源:拿取.方法以及直觉.拿取也就是可重用资源.对于一个标准的系统 ...

  3. 学习的目的:理解<转>

    http://www.hkuspacechina.com/chs/news-and-events/news/detail/news-first-day-of-school-2015-04-23 学习的 ...

  4. go read text file into string array

    http://stackoverflow.com/questions/5884154/golang-read-text-file-into-string-array-and-write 方法一 pac ...

  5. spring 定时器Quartz

    一.Quartz是什么 二.  核心接口 scheduler  --- 核心调度器 Job  --- 任务 JobDetail  --- 任务描述 Tigger  --- 触发器 三 . 核心接口之间 ...

  6. 二模15day1解题报告

    T1.合并序列(minval) 给出长为 n的AB两个序列求两两相加中最小的n个. 据说有证明(在蓝书上,优先队列部分)先把A[1~n]+b[1]入队,然后每取一个a[x]+b[y]就把a[x]+b[ ...

  7. linux系统limit知识

    1.limit限制每个shell进程和它的子进程对资源的占用.每个登录,还是每个进程? 比如ulimit -n 10240 可以临时改变当前session的shell进程的文件句柄数限制,退出当前窗口 ...

  8. .NET (四)委托第四讲:内置委托Comparison

    // 摘要: // 表示比较同一类型的两个对象的方法. // // 参数: // x: // 要比较的第一个对象. // // y: // 要比较的第二个对象. // // 类型参数: // T: / ...

  9. selenium3.0.1调用firefox

    报错信息如下时: selenium.common.exceptions.WebDriverException: Message: 'geckodriver' executable needs to b ...

  10. 常用的dos命令

    cd 进入一个目录 cd .. 返回上一个目录 dir 遍历目录 上下键 查找输入过的命令 Tab键 命令自动补齐