iOS- CoreData 数据库管理利器!
1.前文
上次用SQLite3实现了数据管理,这次准备用CoreData来实现。
Core Data 是iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用Core Data框架,程序员可以很轻松有效地通过面向对象的接口管理数据
相比SQLite3来说,用CoreData更有利于程序员来管理数据,
除了开头的准备工作略微繁琐点,后面的操作都很方便。
而且在CoreData在数据操作过程中,无需编写任何SQL语句,这一点和JAVA里的hibernate框架类似。
那么,下面我就直接说说它的实现步骤。
2.CoreData实现的主要步骤
2.1.要使用Core Data,首先需要导入CoreData框架
表结构:NSEntityDescription
表记录:NSManagedObject
数据库存放方式:NSPersistentStoreCoordinator(持久化存储协调者)
数据库操作:NSManagedObjectContext(被管理的对象上下文)
2.2.接着要使用Code Data,首先需要定义模型文件,描述应用程序中的所有实体(Entities)

2.3.创建连接数据库
- 首先需要创建一个操作数据库的上下文。NSManagedObjectContext
- 操作数据库的上下文需要设置一个调度者属性,这个调度者是用来将图形化建立的模型和数据库联系起来。
- 给调度者添加一个需要联系的数据库。
// Merging合并可以将图形化建立的所有Model汇总到一个数据库文件中
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; // 调度者的实例化,需要Model
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; // 数据库是一个文件,持久化连接的文件
NSError *error = nil;
NSURL *url = [@"my.db" appendDocumentDirURL]; // 添加持久化存储的数据库
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]; if (error == nil) {
NSLog(@"数据库建立成功"); // 获取到数据库操作的上下文,类似于SQLite的句柄
_sharedContext = [[NSManagedObjectContext alloc] init]; // 让上下文记录住存储调度
_sharedContext.persistentStoreCoordinator = store;
} else {
NSLog(@"数据库建立失败");
}
2.4.添加,更新,删除
添加:
1.新建实体 INST (插入)
Person *p = [[Person alloc] init]
2.设置实体的属性
// 设置对象内容
person.name = _nameText.text;
person.phoneNo = _phoneText.text;
person.qq = _qqText.text;
person.weibo = _weiboText.text;
3.保存上下文
//实体描述
[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context] // 获取上下文
NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext]; // 让上下文保存
if ([context save:nil]) {
NSLog(@"保存成功"); // 返回上级视图控制器
[self.navigationController popViewControllerAnimated:YES];
} else {
NSLog(@"保存失败!");
}
更新:
1.判断是否已有一模一样的模型
//判断
Person *person = _editPerson; // 如果person == nil表示是新建用户
if (person == nil) {
person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
}
2.设置实体属性
person.name = _nameText.text;
person.phoneNo = _phoneText.text;
person.qq = _qqText.text;
person.weibo = _weiboText.text;
3.保存上下文
// 让上下文保存
if ([context save:nil]) {
NSLog(@"保存成功"); // 返回上级视图控制器
[self.navigationController popViewControllerAnimated:YES];
} else {
NSLog(@"保存失败!");
}
删除
// 1. 首先找到要删除哪条记录
Person *person =
// 2. 删除
NSManagedObjectContext *context = [[DataManager sharedDataManager] sharedContext]; // 让上下文删除
[context deleteObject:person]; // 上下文保存
if ([context save:nil]) {
NSLog(@"删除成功!");
} else {
NSLog(@"删除失败!");
}
2.4.查询
三.查询
1.使用NSFetchedResultsController控制器
// 查询结果控制器
NSFetchedResultsController *_fetchedResultsController;
2.监控managed object context对象的改变,报告给delegate
// 设置代理
_fetchedResultsController.delegate = self;
2.1当操作数据上下文的内容改变的时候,会自动调用抓取结果控制器的代理方法
#pragma mark 查询结果控制器代理方法
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
// 新增、修改、删除
[self.tableView reloadData];
}
3.创建控制器
一般来说,你会创建一个NSFetchedResultsController实例作为tableview的成员变量。初始化的时候,你提供四个参数:
1。 一个fetchrequest.必须包含一个sortdescriptor用来给结果集排序。
2。 一个managedobject context。 控制器用这个context来执行取数据的请求。
3。 一个可选的keypath作为sectionname。控制器用keypath来把结果集拆分成各个section。(传nil代表只有一个section)
4。 一个cachefile的名字,用来缓冲数据,生成section和索引信息。
NSFetchRequest *reqest = _fetchedResultsController.fetchRequest;
> 查询请求
> 数据库上下文
> 表格中用于分组的字段名
> 缓存名称
*/
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:context sectionNameKeyPath:nil cacheName:nil];
5.注意:一定要执行抓取请求,返回的数据在sections里,这个数组中装的都是遵守NSFetchedResultsSectionInfo这个协议的对象。通过numberOfObjects就能获取一组有多少数据对象了。
return [_fetchedResultsController.sections[] numberOfObjects];
清澈Saup
iOS- CoreData 数据库管理利器!的更多相关文章
- iOS抓包利器Charles
iOS抓包利器Charles http://wonderffee.github.io/blog/2013/07/13/best-packet-capture-tool-charles-in-ios/ ...
- iOS CoreData技术学习资源汇总
一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...
- IOS CoreData 多表查询demo解析
在IOS CoreData中,多表查询上相对来说,没有SQL直观,但CoreData的功能还是可以完成相关操作的. 下面使用CoreData进行关系数据库的表与表之间的关系演示.生成CoreData和 ...
- iOS CoreData (一) 增删改查
代码地址如下:http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映 ...
- iOS CoreData (二) 版本升级和数据库迁移
前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...
- IOS CoreData 多表查询(下)
http://blog.csdn.net/fengsh998/article/details/8123392 在iOS CoreData中,多表查询上相对来说,没有SQL直观,但COREDATA的功能 ...
- iOS CoreData 介绍和使用(以及一些注意事项)
iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...
- iOS CoreData介绍和使用(以及一些注意事项)
iOS CoreData介绍和使用(以及一些注意事项) 最近花了一点时间整理了一下CoreData,对于经常使用SQLite的我来说,用这个真的有点用不惯,个人觉得实在是没发现什么亮点,不喜勿喷啊.不 ...
- iOS开发--数据库管理CoreData的使用
CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架.CoreData本质上是将底层数据库封装成对象进行管理.但数据库实际上只是CoreData的一个功能,并不是全部功能. ...
- iOS - CoreData 数据库存储
1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...
随机推荐
- sass(@at-root与&配合使用、without和with)
@at-root与&配合使用(找父级) scss.style css.style 应用于@keyframe scss.style css.style @at-root (without: .. ...
- 面试题Spring Boot
Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...
- golang闭包
http://blog.51cto.com/speakingbaicai/1703229 https://www.jianshu.com/p/fa21e6fada70 所谓闭包就是一个函数" ...
- JS复制DOM元素文字内容
要实现的效果:将HTML页面中的某个DOM元素例如DIV下面的文本内容进行复制. 实现过程如下: <html> <head> <title>Copy text De ...
- order by注入点利用方式分析
漏洞分析 使用sqli-lab中的lesson-52作为测试目标.关键代码为: error_reporting(0); $id=$_GET['sort']; if(isset($id)) { //lo ...
- 【Leetcode】【Medium】Find Minimum in Rotated Sorted Array
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- 高质量C++C编程指南笔记 标签: c++笔记 2015-11-22 20:59 179人阅读 评论(0) 收藏
1. 在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少 CPU 跨切循环层的次数. 2. 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面 ...
- 索引反向使用案例,加index_desc hint
drop index idx_t;create index idx_t on t(owner desc,object_type asc); select /*+index(a,idx_t)*/ * f ...
- Event Driven Architecture
在微服务中使用领域事件 稍微回想一下计算机硬件的工作原理我们便不难发现,整个计算机的工作过程其实就是一个对事件的处理过程.当你点击鼠标.敲击键盘或者插上U盘时,计算机便以中断的形式处理各种外部事件 ...
- POJ-1061 青蛙的约会---扩展欧几里得算法
题目链接: https://cn.vjudge.net/problem/POJ-1061 题目大意: 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线 ...