格而知之3:Core Data的基本使用
最近准备做一个随手笔记类的app给自己用,考虑到从未使用过Core Data,就决定用Core Data来做数据存储。在网上参考了一些Core Data的资料后,用一天的时间写了这个demo,主要测试了增删改查,以及排序和分页这些基本功能。
demo的代码可以在GitHub上下载:
https://github.com/ShayneYeorg/Core-Data-Sample
1、大致上,Core Data即是将数据库内容封装成了类和对象:
(1)、一个数据库实例对应一个NSManagedObjectModel:根据苹果的官方文档,一个NSManagedObjectModel的实例表示程序中使用到的所有Entity的集合的提纲;
(2)、一张数据库表对应成了一个Entity实例;
(3)、数据库表中的每条记录对应一个NSManagedObject对象;
(4)、记录里的每个字段就对应了NSManagedObject对象的每一个属性。
它们之间的关系大致如下图:

2、接下来开始新建项目,主要记得勾选上“Use Core Data”

3、Xcode会在AppDelegate里面生成三个属性和若干方法,3个属性分别是:
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
(1)、从1中已知NSManagedObjectModel的实例即可理解为一个数据库实例;
(2)、NSManagedObjectContext是用来管理NSManagedObject的上下文,所有对NSManagedObject的实例的增删改查都要通过NSManagedObjectContext的实例来操作;
(3)、而NSManagedObjectContext的实例在将NSManagedObject的增删改查等操作结果保存到持久化存储(persistent stores)中的时候,就需要通过NSPersistentStoreCoordinator的实例来做中间人(协调员),一个NSManagedObjectContext的实例如果没有NSPersistentStoreCoordinator的实例来协助,那它在功能上就是不完整的(not fully functional)。
4、Entity需要手动建立。在项目中会生成一个xcdatamodeld后缀的文件,在这个文件的下方点击“Add Entity”,然后修改Entity的名称,以及添加属性:


同时还要根据Entity的内容生成对应的类:新建文件,选择NSManagedObject subclass类文件,根据提示勾选上对应的Entity。

那么就可以生成对应的类文件了,一个名为Article的Entity生成的类文件如下:

Article+CoreDataProperties文件里就包含了刚才定义好的几个属性(表字段),Article可以用来添加一些对象操作的特定方法。
5、接下来就是Core Data的基本增删改查操作,即是对Entity的增删改查操作。由于所有的操作都要通过NSManagedObjectContext的实例来操作,而Xcode已经在appDelegate里生成好了一个NSManagedObjectContext属性,此时要进行增删改查操作就要先把这个NSManagedObjectContext实例引进进来:
...
@property (weak, nonatomic) AppDelegate *appDelegate;
...
self.appDelegate = [[UIApplication sharedApplication] delegate];
...
6、Core Data的增加操作:
//新增数据
- (void)addArticle {
NSString *title = self.titleFiled.text;
NSString *content = self.contentField.text; Article *article = [NSEntityDescription insertNewObjectForEntityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext]; article.title = title;
article.content = [content dataUsingEncoding:NSUTF8StringEncoding];
article.createTime = [NSDate date]; NSError *error = nil;
if ([self.appDelegate.managedObjectContext save:&error]) {
if (error) NSLog(@"新增时发生错误:%@,%@",error,[error userInfo]);
} [self.navigationController popViewControllerAnimated:YES];
}
7、Core Data的删除操作:
//删除数据
- (void)removeArticleFromDataSource:(Article *)article {
[self.appDelegate.managedObjectContext deleteObject:article];
NSError *error = nil;
if(![self.appDelegate.managedObjectContext save:&error]) NSLog(@"删除数据时发生错误:%@,%@",error,[error userInfo]);
}
8、Core Data的修改操作:
//修改数据:每个Entity实例都会有一个独一无二的objectID,通过这个来找到Entity实例
- (void)alterArticle {
Article *article = [self.appDelegate.managedObjectContext objectWithID:self.objectID];
article.title = self.titleFiled.text;
article.content = [self.contentField.text dataUsingEncoding:NSUTF8StringEncoding]; NSError *error = nil;
if ([self.appDelegate.managedObjectContext save:&error]) NSLog(@"修改成功"); [self.navigationController popViewControllerAnimated:YES];
}
9、Core Data的查询操作:
//查询数据
- (NSMutableArray *)fetchArticlesFromDataSource {
//request和entity,通过request来查询
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:self.appDelegate.managedObjectContext];
[request setEntity:entity]; //设置排序规则
NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"createTime" ascending:NO];
NSArray * sortDescriptors = @[sort];
[request setSortDescriptors:sortDescriptors]; //设置分页规则
NSInteger offset = ;
NSInteger limit = ;
[request setFetchLimit:limit];
[request setFetchOffset:offset]; //设置查询条件
NSString *str = [NSString stringWithFormat:@"title LIKE '*%@*'", searchStr];
NSPredicate *pre = [NSPredicate predicateWithFormat:str];
[request setPredicate:pre]; //查询
NSError *error = nil;
NSMutableArray *articles = [[self.appDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (articles == nil) NSLog(@"查询所有数据时发生错误:%@,%@",error,[error userInfo]);
return articles;
}
10、至此演示完Core Data的基本增删改查操作。
格而知之3:Core Data的基本使用的更多相关文章
- 我为什么用 SQLite 和 FMDB 而不用 Core Data
凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...
- 《驾驭Core Data》 第二章 Core Data入门
本文由海水的味道编译整理,请勿转载,请勿用于商业用途. 当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...
- 使用Core Data应避免的十个错误
原文:Avoiding Ten Big Mistakes iOS Developers Make with Core Data http://www.cocoachina.com/applenew ...
- iOS 数据持久化(3):Core Data
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...
- 谈谈用SQLite和FMDB而不用Core Data
谈谈用SQLite和FMDB而不用Core Data 发布于:2014-04-22 11:22阅读数:4235 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他 ...
- Core Data (一)备
序 恩,用Core Data也有一段时间了.大大小小的坑也都坑过了.重来没有认真的记录一次.这次需要好好的理一理Core Data.就当一次绝好的机会记录下来.也为了自己加深认识. 为什么要用Core ...
- obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]
上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...
- 自定义 Core Data 迁移
本文转载至 http://objccn.io/issue-4-7/ 感谢本文作者 朱宏旭 的不啬分享 自定义 Core Data 迁移似乎是一个不太起眼的话题.苹果在这方面只提供了很少的文档,若是初次 ...
- Core Data 迁移与版本管理
原文 http://chun.tips/blog/2014/11/28/core-data-ban-ben-qian-yi-jing-yan-zong-jie/ 主题 Core DataiOS开发 ...
随机推荐
- 面向切面编程(AOP)的理解
在传统的编写业务逻辑处理代码时,我们通常会习惯性地做几件事情:日志记录.事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码.当代码编写完成回头再看时,不禁发现,扬扬洒洒上百行代码中,真正用于核心 ...
- Android控件TextView的实现原理分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8636153 在前面一个系列的文章中,我们以窗口 ...
- ASP.NET MVC 阻止当前请求的视图页面缓存OutputCache
设置缓存 [OutputCache(Duration =333,VaryByCustom ="Index")] 缓存: //在action中,临时阻止该次请求的视图页面缓存 Res ...
- Js获取Gridview中Dropdownlist选中状态
在Gridview中加入Dropdownlist模板列,加入DropDownlist 是一种常用的操作,其中涉及到如何获取选择项和Gridview重新绑定两个要点. 如图 前台代码如下 <%@ ...
- photoshop动作面板批量处理图片边框技巧
1,想给图片加上边框,在不改变图片大小的前提下,可以这样做:ctrl+a,全选图片,然后“编辑”-----“描边”,在跳出来的选项卡里面可以设置边框颜色,大小,位置,及混合模式, ,我们设置好了,就可 ...
- FLASH图片上传功能—从百度编辑器UEditor里面提取出来
为了记录工作中碰到的各种问题,以及学习资料整理,今天开始,将以往的文章进行了一个整理,以后也开始认真的记录学习过程中的各种问题 在HTML里面的文件上传功能一直是个问题,为了实现上传文件大小限制,怎样 ...
- SQL Server 模式和名称解析
模式实际上是名称空间,因此在SQL Serve中调用数据库对象时,一定要设置对象引用的环境.每个用户都被赋予了一个默认模式,在用户登录SQL Server并凋用数据库对象时,这个默认模式就是对象引用方 ...
- 客户端调用web中js方法(C调B)跨域问题
这几天遇到了个棘手问题(c调b),经过排错查出了问题. 一,问题描述如下: 1.客户端需要调用father.html中一个js方法,特殊之处在于 这个father.html中有个iframe嵌套了一个 ...
- calc()函数的使用
calc()函数算是css中的一个另类了,一般来说css都是直接确定的样式,而calc()函数却是可以动态计算,这和css静态的概念有些区别,但这并不妨碍其优秀的性能. 什么是calc()? calc ...
- POJ 2135 Farm Tour (最小费用最大流模板)
题目大意: 给你一个n个农场,有m条道路,起点是1号农场,终点是n号农场,现在要求从1走到n,再从n走到1,要求不走重复路径,求最短路径长度. 算法讨论: 最小费用最大流.我们可以这样建模:既然要求不 ...