// 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. qt之mapx组件编程c2248和c2512错误

    mapx组件利用qt工具dumpcpp到处头文件和.cpp文件后将其加入到新建的qt项目中即可. 不过本人遇到问题知道今天偶然的解决了.记下来,以免忘记. demo的项目结构如下: 然后在.pro文件 ...

  2. http国际化模拟请求

    现在好多系统都有国际化的需求.不同国家的人读到不同的语言数据.那么怎么模拟请求的时候区分是哪个国家的语言信息,代码说明. HttpPost methed = new HttpPost("模拟 ...

  3. 【ios 7】 之后的设置系统的状态栏隐藏的方法分享

    由于在做视频播放的的项目,一直困扰的是,视频全屏幕播放的时候,系统的状态栏会隐藏不掉,虽然可以设置为透明的状态来显示,但是电池的状态一直隐藏不掉,查看网上的说法也就是说,要么来控制,他的hidden ...

  4. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

  5. Java堆内存的十个要点

    Java中的堆空间是什么? 当Java程序开始运行时,JVM会从操作系统获取一些内存.JVM使用这些内存,这些内存的一部分就是堆内存.堆内存通常在存储地址的底层,向上排列.当一个对象通过new关键字或 ...

  6. C#笔试(程序设计)

    1.如何把一个Array复制到ArrayList里,如何把ArrayList复制到Array里? foreach( object o in array )arrayList.Add(o); Array ...

  7. 关于ddpush推动实现抖动视频的使用

    /**   //开机之后打开服务  开机成功打开服务ddpushService**/ <!-- 开机广播 --> <receiver android:name="com.r ...

  8. ASP.NET Misconfiguration: Missing Error Handling

    Abstract: An ASP .NET application must enable custom error pages in order to prevent attackers from ...

  9. MySQL连接线程kill利器之pt-kill

    如何每10秒检查一次,杀死指定用户超过100秒的查询? pt-kill \ --no-version-check \ --host 127.0.0.1 --port 3306 --user 'xxxx ...

  10. OpenGL 矩阵变换

    Overview 几何数据--顶点位置,和标准向量(normal vectors),在OpenGL 管道raterization 处理过程之前可通过顶点操作(Vertex Operation)和基本组 ...