CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架。CoreData本质上是将底层数据库封装成对象进行管理。但数据库实际上只是CoreData的一个功能,并不是全部功能。在iOS开发中,除了可以使用CoreData进行数据管理,还可以使用SQLite进行内存管理。并且有封装好SQLite代码的OC框架FMDB给我们使用。具体看我上篇文章。SQLite重要框架FMDB的使用.但对比SQLite,CoreData有下面几个优势。第一是CoreData作为苹果提供的原生框架,在内存方法比SQLite有性能上的优势。第二是CoreData操作数据不需要使用SQLite代码,使用方便。第三是CoreData把数据用面向对象方式进行管理,操作数据库更方便。
CoreData的核心是Core Data stack(技术栈堆)。CoreData就是依靠Core Data stack中的几个对象进行数据操作的。这几对象是:
NSManagedObjectContext ,管理对象的上下文: 负责管理模型对象的一个集合,
NSManagedObjectModel 被管理的对象模型
NSPersistentStoreCoordinator 存储调度器: 负责将数据保存到磁盘,
NSPersistentStore用于保存模型数据,受NSPersistentStoreCoordinator 存储调度器的操控。
这三个对象的关系如下面图片所示,苹果官方给出了这几个对向关系的图解。简单理解起来就是最上面的NSManagedObjectContext负责管理对象模型。然后将管理的对象模型发送给NSPersistentStoreCoordinator 存储调度器,存储调度器通过NSPersistentStore操作SQLite语句,将数据持久化到本地,保存到StoryFile中。

Paste_Image.png

Paste_Image.png

Paste_Image.png

数据库的使用也很简单,我们只需要在创建项目文件的时候勾选使用coreData的选项,系统就会帮我们创建一个包含CoreData的项目文件。

Paste_Image.png

然后在界面上就会出现下面的变化。我们点击添加属性按钮,就能在数据库中给数据模型添加属性。

Paste_Image.png

添加完数据库后我们进行下面操作就能将数据模型转为代码文件。

Paste_Image.png

做完上面操作之后我们就能对数据库模型进行操作了。

Paste_Image.png

我们在操作数据,对数据进行增删改查的时候,都需要用到Core Data stack这个工具。我们自己可以封装一个Core Data stack,这样更能加深我们对Core Data stack这个工具的理解。
下面是封装一个工具类的代码:
首先是该工具类的.h文件中的代码

  1. #import <Foundation/Foundation.h>
  2. #import <CoreData/CoreData.h>
  3. #define KXBCoreManagerInstance [HMCoreDataStackManager shareInstance]
  4. @interface HMCoreDataStackManager : NSObject
  5. ///单例
  6. +(HMCoreDataStackManager*)shareInstance;
  7. ///管理对象上下文
  8. @property(strong,nonatomic)NSManagedObjectContext *managerContenxt;
  9. ///模型对象
  10. @property(strong,nonatomic)NSManagedObjectModel *managerModel;
  11. ///存储调度器
  12. @property(strong,nonatomic)NSPersistentStoreCoordinator *maagerDinator;
  13. //保存数据的方法
  14. -(void)save;
  15. @end

然后是.m文件中的代码

  1. #import "HMCoreDataStackManager.h"
  2. @implementation HMCoreDataStackManager
  3. ///单例的实现
  4. +(HMCoreDataStackManager*)shareInstance
  5. {
  6. static HMCoreDataStackManager *instance = nil;
  7. static dispatch_once_t onceToken;
  8. dispatch_once(&onceToken, ^{
  9. instance = [[HMCoreDataStackManager alloc]init];
  10. });
  11. return instance;
  12. }
  13. -(NSURL*)getDocumentUrlPath
  14. {
  15. ///获取文件位置
  16. return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]
  17. ;
  18. }
  19. //懒加载managerContenxt
  20. -(NSManagedObjectContext *)managerContenxt
  21. {
  22. if (_managerContenxt != nil) {
  23. return _managerContenxt;
  24. }
  25. _managerContenxt = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
  26. ///设置存储调度器
  27. [_managerContenxt setPersistentStoreCoordinator:self.maagerDinator];
  28. return _managerContenxt;
  29. }
  30. ///懒加载模型对象
  31. -(NSManagedObjectModel *)managerModel
  32. {
  33. if (_managerModel != nil) {
  34. return _managerModel;
  35. }
  36. _managerModel = [NSManagedObjectModel mergedModelFromBundles:nil];
  37. return _managerModel;
  38. }
  39. -(NSPersistentStoreCoordinator *)maagerDinator
  40. {
  41. if (_maagerDinator != nil) {
  42. return _maagerDinator;
  43. }
  44. _maagerDinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managerModel];
  45. //添加存储器
  46. /**
  47. * type:一般使用数据库存储方式NSSQLiteStoreType
  48. * configuration:配置信息 一般无需配置
  49. * URL:要保存的文件路径
  50. * options:参数信息 一般无需设置
  51. */
  52. //拼接url路径
  53. NSURL *url = [[self getDocumentUrlPath]URLByAppendingPathComponent:@"sqlit.db" isDirectory:YES];
  54. [_maagerDinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];
  55. return _maagerDinator;
  56. }
  57. -(void)save
  58. { ///保存数据
  59. [self.managerContenxt save:nil];
  60. }

通过上面代码可以看出封装一个Core Data stack类并不是很难,我们需要做的是创建一个单例,然后懒加载一个NSManagedObjectContext,并给NSManagedObjectContext添加存储调度器NSPersistentStoreCoordinator。
懒加载存储调度器的时候给存储调度器添加存储器PersistentStore。在最后提供一个保存数据的方法,每次我们修改数据库中文件数据的时候,都需要用Core Data stack调用save方法保存数据。
CoreData关于数据的操作无非就是增删改查。增删改查我们同样需要使用自定义的Core Data stack工具类。
增加数据:

  1. Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" in Managed ObjectContext : kManagedObjectContext.managedObjectContext];
  2. p.age = @(13);
  3. p.name = @"张三";
  4. [kManagedObjectContext save];

删除数据:

  1. //1.创建一个查询请求
  2. NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
  3. //2.创建查询谓词(查询条件)
  4. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];
  5. //3.给查询请求设置谓词
  6. request.predicate = predicate;
  7. //4.查询数据
  8. NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];
  9. //5.删除数据
  10. [kManagedObjectContext.managedObjectContext deleteObject:arr.firstObject];
  11. //6.同步到数据库 [kManagedObjectContext save];

修改数据:

  1. //1.创建一个查询请求
  2. NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
  3. //2.创建查询谓词(查询条件)
  4. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];
  5. //3.给查询请求设置谓词
  6. request.predicate = predicate;
  7. //4.查询数据
  8. NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];
  9. //5.改变数据
  10. arr.firstObject.name = @"李四";
  11. arr.firstObject.age = @(18);
  12. //6.同步到数据库
  13. [kManagedObjectContext save];

查询数据:

  1. //1.创建一个查询请求
  2. NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
  3. //2.创建查询谓词(查询条件)
  4. NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];
  5. //3.给查询请求设置谓词
  6. request.predicate = predicate;
  7. //4.查询数据
  8. NSArray<Person*> *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; NSLog(@"%@====%@",arr.firstObject.name,arr.firstObject.age);

使用CoreData我们可以轻松实现很多数据的操作,例如通讯录数据录的增删改查。
在这里提供一个通讯录数据操作的demo,使用CoreData,我们能轻松地实现通讯录功能。
CoreData实现通讯录

原文链接:http://www.jianshu.com/p/e7411f3ceeb6

iOS开发--数据库管理CoreData的使用的更多相关文章

  1. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...

  2. iOS开发系列-常见离线存储方式

    概述 在很多社交App手机在手机没有网络时,重新启动应用,依然能否展示上次访问的数据,提高用户体验,这个就是离线数据存储的运用场景.在iOS开发中常见的离线存储技术有Plist存储.个人偏好存储.解归 ...

  3. iOS开发系列-SQLite

    概述 SQLite3是一款轻型的嵌入式数据库.它占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了.它的处理速度比Mysql.PostgreSQL这两款著名的数据库速度还快. 数据库简介 常 ...

  4. iOS开发系列--数据存取

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  5. iOS开发之记录用户登录状态

    iOS开发之记录用户登录状态 我们知道:CoreData的配置和使用步骤还是挺复杂的.但熟悉CoreData的使用流程后,CoreData还是蛮好用的.今天要说的是如何记录我们用户的登陆状态.例如微信 ...

  6. iOS-提高iOS开发效率的方法和工具

    提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时 ...

  7. iOS开发之SQLite--C语言接口规范(五)——iOS开发使用SQLite实例

    本篇博客就使用前面操作SQLite的知识来实现如何去插入,删除和更新数据.然后再把操作SQlite数据库常用的方法进行一个封装.把常用方法进行封装后,把Cars数据库中的其中一个表的数据进行查询,并在 ...

  8. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  9. iOS开发之使用XMPPFramework实现即时通信(二)

    上篇的博客iOS开发之使用XMPPFramework实现即时通信(一)只是本篇的引子,本篇博客就给之前的微信加上即时通讯的功能,主要是对XMPPFramework的使用.本篇博客中用到了Spark做测 ...

随机推荐

  1. 安卓自定义控件(一)Canvas、Paint、Shader、Xfermode

    关于自定义控件,之前就写过一篇自定义控件,上图下字的Button,图片任意指定大小,但是使用效果还是让人感觉不幸福,这次索性彻彻底底地对自定义控件做一次彻彻底底的总结. 我会花4篇博客来介绍自定义控件 ...

  2. 13. ZooKeeper最佳实践

    以下列举了运行和管理ZooKeeper ensemble的一些最佳实践: ZooKeeper数据目录包含快照和事务日志文件.如果autopurge选项未启用,定期清理目录是一个好习惯.另外,管理员可能 ...

  3. ThinkPHP中的Model模型

    一     实例化模型对象 ①实例化通用模型 例:$goods_model = new \Model\GoodsModel(); $goods_Model = D('Goods'); ②实例化基例模型 ...

  4. codeforces 887A Div. 64 思维 模拟

    A. Div. 64 time limit per test 1 second memory limit per test 256 megabytes input standard input out ...

  5. PHP扩展代码结构详解

    PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/ ...

  6. EntityFrameworkCore v1.1.1 问题汇总

    随着宇宙第一IDE的最新版本发布[2017/3/7],AspNetCore 和EntityFrameworkCore(团队)都发布了最新的代码. 不过在我看来,这些到还不是最重要的.最重要的是dotn ...

  7. Python爬虫(十六)_JSON模块与JsonPath

    本篇将介绍使用,更多内容请参考:Python学习指南 数据提取之JSON与JsonPATH JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它是的人们很容易 ...

  8. WebSocket解析

    WebSocket解析 转载请注明出处:WebSocket解析 现在,很多网站为了实现推送技术,所用的技术都是轮询.轮询是指在特定的时间间隔(如每一秒),由浏览器对服务器发起HTTP请求,然后由服务器 ...

  9. C++ 虚指针、成员变量与类对象的偏移地址

    先给出一段代码实现 #include <iostream> using namespace std; class animal { protected: int age; public: ...

  10. C#基础知识 简单说明泛型的优点

    有关泛型的优缺点在网上有很多篇文章,也足以说明问题,我就不去复制粘贴了(而且内容有些多),由于记性不太好,所以自己做个简单明了的总结. 泛型的优点主要有两个: "性能" " ...