最近准备做一个随手笔记类的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的基本使用的更多相关文章

  1. 我为什么用 SQLite 和 FMDB 而不用 Core Data

    凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他Cocoa开发者所理解,当有新人加入你的组或者需要别人接手你的项目的时候,这点很重要.更重要的是,不值得花时间和 ...

  2. 《驾驭Core Data》 第二章 Core Data入门

    本文由海水的味道编译整理,请勿转载,请勿用于商业用途.    当前版本号:0.4.0 第二章 Core Data入门 本章将讲解Core Data框架中涉及的基本概念,以及一个简单的Core Data ...

  3. 使用Core Data应避免的十个错误

    原文:Avoiding Ten Big Mistakes iOS Developers Make with Core Data   http://www.cocoachina.com/applenew ...

  4. iOS 数据持久化(3):Core Data

    @import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css); @import url(/ ...

  5. 谈谈用SQLite和FMDB而不用Core Data

    谈谈用SQLite和FMDB而不用Core Data 发布于:2014-04-22 11:22阅读数:4235 凭良心讲,我不能告诉你不去使用Core Data.它不错,而且也在变好,并且它被很多其他 ...

  6. Core Data (一)备

    序 恩,用Core Data也有一段时间了.大大小小的坑也都坑过了.重来没有认真的记录一次.这次需要好好的理一理Core Data.就当一次绝好的机会记录下来.也为了自己加深认识. 为什么要用Core ...

  7. obj-c编程15[Cocoa实例04]:基于Core Data的多文档程序示例[未完待续]

    上一个例子我们使用的模式数据实际上是基于一个Person数组,现在我们看一下如何使用Cocoa中的Core Data框架支持,几乎不用写一行代码,完成模式数据的建立. 我们这里模式的元素使用的是Car ...

  8. 自定义 Core Data 迁移

    本文转载至 http://objccn.io/issue-4-7/ 感谢本文作者 朱宏旭 的不啬分享 自定义 Core Data 迁移似乎是一个不太起眼的话题.苹果在这方面只提供了很少的文档,若是初次 ...

  9. Core Data 迁移与版本管理

    原文  http://chun.tips/blog/2014/11/28/core-data-ban-ben-qian-yi-jing-yan-zong-jie/ 主题 Core DataiOS开发 ...

随机推荐

  1. 在Struts2中使用Uploadify组件上传文件

    Uploadify是一个基于Jquery的文件上传组件,官网http://www.uploadify.com/可以在官网获得该组件,运行演示示例,下载帮助文档.     作为Web前端的增强技术,Jq ...

  2. 开源 免费 java CMS - FreeCMS2.0 会员我的评论

    项目地址:http://www.freeteam.cn/ 我的评论 从左側管理菜单点击我的评论进入. 在这里能够查看当前登录会员的全部评论记录. 删除评论 选择评论然后点击删除button能够完毕删除 ...

  3. Git的一些用法(建立新的branch)

    建立新的branch和查看全部的branch(kk的代码是基于现有的branch) 切换到branch kk: 当然我们也能够在android studio里操作: 注意切换的时候代码会丢失,必须先c ...

  4. [重磅] 让HTML5达到原生的体验 系列之中的一个 避免切页白屏

    非常多人都想.甚至曾使用HTML5开发跨平台App.而且想达到原生App的体验. 最后的结果都是无奈的放弃.HTML5貌似美好,但坑太多.想做到原生App的体验差点儿不可为. 也曾有过著名的faceb ...

  5. 把一个select查询结果插入到一个表(可选指定字段和值实例)

    把一个select查询结果插入到一个表(可选指定字段和值实例) insert into  bak (cc,yf) select cc,9 from ket insert into bak (cc,yf ...

  6. 调起qq临时通话

    1.在qq推广的网站上的推广工具中将个人或者公司的qq确认为推广qq 2. 选择好显示的图片,将代码拷贝到页面上就可以了

  7. 【css基础】文本对齐,水平对齐,垂直对齐

    先说水平对齐,那首先想到的就是text-align了,text-align:left,text-align:center,text- align:right,代表的就是左对齐,居中对齐和右对齐,需要注 ...

  8. css基本属性

    CSS属性分类(最最常用的属性):颜色和长度文字盒模型布局定位背景文本和其他 常用CSS属性: <style>div{ color:#23729e; /*前景色*/ background: ...

  9. BestCoder Round #36 (hdu5198)Strange Class(水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Strange Class Time Limit: 2000/1000 MS (J ...

  10. codeforces 339C Xenia and Weights(dp或暴搜)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud Xenia and Weights Xenia has a set of weig ...