CoreData的介绍和使用 

源引:http://www.jianshu.com/p/d027090af00e

CoreData是数据存储的一种方式,CoreData实质也是对SQLite的封装。

CoreData是iOS SDK里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据。使用CoreData框架,程序员可以很轻松有效地通过面向对象的接口管理数据。

CoreData框架提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。

在实际开发中,新建项目的时候会看到有Use Core Data的选项。

图1

CoreData和SQLite的最大区别在于:SQLite使用的是SQL语句,属于面向过程。而CoreData不适用SQL语句,将这一过程封装成面向对象。将表,字段,记录分别封装成实体,属性和对象,更符合面向对象的思想。

再回到项目中,新建项目之后会发现相比较于普通项目,CoreData项目多了一个后缀名为xcdatamodeld的文件

图2

在AppDelegate.h文件中会多出了三个属性和两个方法。还会自动导入CoreData框架

图3

在AppDelegate.m文件中会多出一些属性的get方法和方法的实现(从47行-125行)

图4

添加实体

点击xcdatamodeld文件->点击AddEntity->再双击上方的实体名,输入想要的实体名。(注意:实体名一定要大写)

图5

点击右侧的Attributes下方的+号可以添加属性

图6

添加对象

添加对象之前我们先来了解一下CoreData的主要对象。如下所示:

NSManagedObjectContext:也可以称为托管对象上下文,负责应用和数据库之间的交互(CRUD)也就是说用来存东西的。

NSPersistentStoreCoordinator:持久化存储协调器。添加持久化存储库(如SQLite数据库),是物理数据存储的物理文件和程序之间的联系的桥梁,负责管理不同对象上下文,用来存储上下文的

NSManagedObjectModel:被管理的对象模型,对应定义的模型文件。管理对象的属性(字段)。

NSEntityDescription:实体描述(往数据库填东西的时候一定要先创建一个实体描述。可以看做是指定表名的东西)

/**

*托管对象上下文,增删改查都需要它

*/

@property(readonly,strong,nonatomic)NSManagedObjectContext*managedObjectContext;

/**

*托管对象模型文件

*实际上这个对象就是将xcdatamodel文件和此对象做一个关联。转换出来变为对象

*/

@property(readonly,strong,nonatomic)NSManagedObjectModel*managedObjectModel;

/**

*持久化储存协调器

*实际上就是应用程序与数据库之间建立的桥梁

*/

@property(readonly,strong,nonatomic)NSPersistentStoreCoordinator*persistentStoreCoordinator;

/**

*保存托管对象上下文的内容,增删改之后都要执行此方法

*当保存时,托管对象上下文的内容就会通过持久化存储协调器进行数据的保存,并且按照模型文件一一对应保存。

*/

- (void)saveContext;

/**

*应用程序文档目录,也就是CoreData保存的文件的目录

*

*@return文件保存路径

*/

- (NSURL*)applicationDocumentsDirectory;

在ViewController里面导入AppDelegate头文件

- (void)viewDidLoad {

[superviewDidLoad];

//使用CoreData添加数据

AppDelegate*appDelegate = [UIApplicationsharedApplication].delegate;

self.manageObjectContext= [appDelegatemanagedObjectContext];

[self insertData];

[self updateData];

}

- (void)insertData {

NSEntityDescription*entity = [NSEntityDescriptionentityForName:@"Person"inManagedObjectContext:self.manageObjectContext];

Person*person = [[Personalloc]initWithEntity:entityinsertIntoManagedObjectContext:self.manageObjectContext];

person.name=@"钢铁侠";

person.age=@40;

person.height=@180;

__autoreleasingNSError*error;

[self.manageObjectContextsave:&error];

if(error) {

NSLog(@"数据添加失败");

}else{

NSLog(@"数据添加成功");

}

}

修改数据的方法:修改数据的方法只需要直接修改对象的属性即可,再保存上下文。

在属性列表里添加属性

@property(nonatomic,strong)Person*selectedPerson;

在插入数据方法的方法里面将创建的对象赋值给selectedPerson

self.selectedPerson= person;

实现方法

- (void)updateData{

//修改数据

self.selectedPerson.name=@"Mark47";

self.selectedPerson.age=@1;

__autoreleasingNSError*error;

//保存数据

[self.manageObjectContextsave:&error];

if(error) {

NSLog(@"数据更新失败");

}else{

NSLog(@"数据更新成功");

}

}

删除数据:删除数据只要执行deleteObject方法,然后在保存上下文即可

- (void) deleteData{

[self.manageObjectContextdeleteObject:self.selectedPerson];

__autoreleasingNSError*error;

[self.manageObjectContextsave:&error];

if(error) {

NSLog(@"数据删除失败");

}else{

NSLog(@"数据删除成功");

}

}

sqlite的使用

源引:http://www.360doc.com/content/14/1224/22/20918780_435534837.shtml

  1. // 使用前需要引入 注意是<>括号,不是双引号
  2. #import <sqlite3.h>
  1. 1 - (void)viewDidLoad {
  2. 2 [super viewDidLoad];
  3. 3 // 打开创建数据库
  4. 4 [self openDataBase];
  5. 5 // 创建数据表
  6. 6 [self createTables];
  7. 7 // 插入数据
  8. 8 [self insertData];
  9. 9 // 查找数据
  10. 10 [self findData];
  11. 11 // 删除数据
  12. 12 [self deleteData];
  13. 13 // 修改数据
  14. 14 [self updataData];
  15. 15 }
  16. 16 #pragma mark -打开创建数据库
  17. 17 -(void)openDataBase{
  18. 18 // 创建并打开数据库
  19. 19 // 获取数据库的路径
  20. 20 NSString *documentPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
  21. 21 // 设置数据库的路径和名词
  22. 22 NSString *dataBasePath=[[NSString alloc]initWithString:[documentPath stringByAppendingPathComponent:@"sqlite.sqlite"]];
  23. 23 // 创建并打开数据库
  24. 24 int result = sqlite3_open([dataBasePath UTF8String],&db);
  25. 25 if(result==SQLITE_OK){
  26. 26 NSLog(@"数据库打开成功");
  27. 27 }else{
  28. 28 NSLog(@"数据库打开失败。。");
  29. 29 }
  30. 30 }
  31. 31 #pragma mark -创建数据表
  32. 32 -(void)createTables{
  33. 33 // sql语句
  34. 34 char *sql="create table if not exists t_persons (id integer primary key autoincrement, name text,age integer);";
  35. 35 // 用于保存错误信息
  36. 36 char *error;
  37. 37 // 执行创建语句并接收结果
  38. 38 int result=sqlite3_exec(db,sql,NULL,NULL,&error);
  39. 39 // 判断是否创建成功
  40. 40 if(result!=SQLITE_OK){
  41. 41 NSLog(@"创建数据表失败~~~~~~~:%s",error);
  42. 42 }else {
  43. 43 NSLog(@"数据表创建成功");
  44. 44 }
  45. 45 }
  46. 46 #pragma mark -插入数据
  47. 47 -(void)insertData{
  48. 48 // sql语句
  49. 49 char *sql="inser into t_persons(name,age) values(?,?)";
  50. 50 // 存储的内容
  51. 51 sqlite3_stmt *stmt;
  52. 52 // 执行语句并接收结果
  53. 53 int result=sqlite3_prepare_v2(db,sql,-1,&stmt,NULL);
  54. 54 // 判断是否成功
  55. 55 if(result==SQLITE_OK){
  56. 56 // 绑定数据
  57. 57 sqlite3_bind_text(stmt,1,"lidaze",-1,NULL);
  58. 58 sqlite3_bind_int(stmt,2,10);
  59. 59 // 执行插入语句
  60. 60 if(sqlite3_step(stmt)==SQLITE_DONE){
  61. 61 NSLog(@"插入成功。。。");
  62. 62 }else{
  63. 63 NSLog(@"插入失败");
  64. 64 }
  65. 65 }else{
  66. 66 NSLog(@"语发不通过");
  67. 67 }
  68. 68 // 释放stmt
  69. 69 sqlite3_finalize(stmt);
  70. 70 }
  71. 71 #pragma mark -查找数据
  72. 72 -(void)findData{
  73. 73 // 准备C语言sql语句
  74. 74 char *sql="select * from t_persons";
  75. 75 // 准备stmt
  76. 76 sqlite3_stmt *stmt;
  77. 77 // 判断结果
  78. 78 if(result==SQLITE_OK){//sql语句正确
  79. 79 NSLog(@"SQL语句正确");
  80. 80 // 进行逐行读取内容
  81. 81 while (sqlite3_step(stmt)==SQLITE_ROW){
  82. 82 int ID = sqlite3_column_int(stmt,0);
  83. 83 char *name=(char *)sqlite3_column_text(stmt,1);
  84. 84 int age=sqlite3_column_int(stmt,2);
  85. 85
  86. 86 NSLog(@"id:%i,name:%s,age:%i",ID,name,age);
  87. 87 }
  88. 88 }else{
  89. 89 NSLog(@"sql语句错误");
  90. 90 }
  91. 91 }
  92. 92 #pragma mark -删除数据
  93. 93 -(void)deleteData{
  94. 94 // 准备sql语句
  95. 95 char *sql="delete from t_persons where id=?";
  96. 96 // stmt
  97. 97 sqlite3_stmt *stmt;
  98. 98 // 判断 sql语句时候通过
  99. 99 if(result==SQLITE_OK){
  100. 100 NSLog(@"删除语句正确");
  101. 101 // 绑定数据
  102. 102 sqlite3_bind_int(stmt,1,58);
  103. 103 // 判断时候执行成功
  104. 104 if(sqlite3_step(stmt)==SQLITE_DONE){
  105. 105 NSLog(@"删除成功");
  106. 106 }else{
  107. 107 NSLog(@"删除是吧i");
  108. 108 }
  109. 109 }else{
  110. 110 NSLog(@"删除语句错误");
  111. 111 }
  112. 112 }
  113. 113 #pragma mark -修改数据
  114. 114 -(void)updataData{
  115. 115 // 准备C语言sql语句
  116. 116 char *sql="updata t_persons set name=?,age=18 where id=?;";
  117. 117 // 准备stmt
  118. 118 sqlite3_stmt *stmt;
  119. 119 // 执行sql语句的判断
  120. 120 int result=sqlite3_prepare(db,sql,-1,&stmt,NULL);
  121. 121 // 判断sql语句的判断
  122. 122 if(result==SQLITE_OK){
  123. 123 NSLog(@"修改语句正确");
  124. 124 // 绑定数据
  125. 125 sqlite3_bind_text(stmt,1,"Zeeeee",-1,NULL);
  126. 126 sqlite3_bind_int(stmt,2,62);
  127. 127 // 执行并判断结果
  128. 128 if(sqlite3_step(stmt)==SQLITE_DONE){
  129. 129 NSLog(@"修改成功");
  130. 130 }else{
  131. 131 NSLog(@"修改失败。。。");
  132. 132 }
  133. 133 }else{
  134. 134 NSLog(@"修改语句错误。。。");
  135. 135 }
  136. 136 }

iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用的更多相关文章

  1. iOS开发-常用第三方开源框架介绍

    iOS开发-常用第三方开源框架介绍 图像: 1.图片浏览控件MWPhotoBrowser        实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网 ...

  2. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  3. iOS开发UI篇—UITabBarController简单介绍

    iOS开发UI篇—UITabBarController简单介绍 一.简单介绍 UITabBarController和UINavigationController类似,UITabBarControlle ...

  4. iOS开发UI篇—Modal简单介绍

    iOS开发UI篇—Modal简单介绍 一.简单介绍 除了push之外,还有另外一种控制器的切换方式,那就是Modal 任何控制器都能通过Modal的形式展⽰出来 Modal的默认效果:新控制器从屏幕的 ...

  5. iOS开发UI篇—Kvc简单介绍

    ios开发UI篇—Kvc简单介绍 一.KVC简单介绍 KVC key valued coding 键值编码 KVC通过键值间接编码 补充: 与KVC相对的时KVO,即key valued observ ...

  6. iOS开发UI篇—Quartz2D简单介绍

    iOS开发UI篇—Quartz2D简单介绍 一.什么是Quartz2D Quartz 2D是⼀个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作: 绘制图形 : 线条\三角形\ ...

  7. iOS开发数据库篇—FMDB简单介绍

    iOS开发数据库篇—FMDB简单介绍 一.简单说明 1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来 ...

  8. iOS开发拓展篇—CoreLocation简单介绍

    iOS开发拓展篇—CoreLocation简单介绍 一.简介 1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如 (1)导航:去任意陌生的地方 (2)周边:找餐馆.找酒店.找银行.找电影院 ...

  9. iOS开发UI篇—popoverController简单介绍

    iOS开发UI篇—popoverController简单介绍 一.简单介绍 1.什么是UIPopoverController 是iPad开发中常见的一种控制器(在iPhone上不允许使用) 跟其他控制 ...

随机推荐

  1. Mac下Nginx环境配置

    环境信息: Mac OS X 10.11.1 Homebrew  0.9.5 正文 一.安装 Nginx 终端执行: brew search nginx brew install nginx 当前版本 ...

  2. asp.net Routing 用法

    http://www.cnblogs.com/youring2/archive/2011/07/22/2113595.html asp.net 4.0中提供了Routing 的支持.通过使用routi ...

  3. ABBYY如何使用电子邮件发送OCR结果

    ABBYY FineReader作为一款OCR图文识别软件,在识别文档之后,可以以任何受支持的格式(除HTML外),通过电子邮件发送识别结果,不仅可以发送文档,还可以发送页面图像,本文将为大家讲解如何 ...

  4. 从 Bootstrap 2.x 版本升级到 3.0 版本

    摘自http://v3.bootcss.com/migration/ Bootstrap 3 版本并不向后兼容 v2.x 版本.下面的章节是一份从 v2.x 版本升级到 v3.0 版本的通用指南.如需 ...

  5. Amazon Web Services

  6. [内核]Takslet和Workqueue的应用场景

    转自:http://blog.chinaunix.net/uid-20382483-id-4077101.html tasklet Workqueue 处于atomic context,不能sleep ...

  7. 学习SQL的点点滴滴(二)删除临时表

    select into 创建的表属于临时表,判断是否存在的方法 select c_adno,c_con_no into #temp from tb_contract IF OBJECT_ID( 'te ...

  8. 【Linux】浅谈段页式内存管理

    让我们来回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址.如果这个系统只运行一个程序,那么只要这个程序所需的内存不要超过该机器的物理内存 ...

  9. Fighting Game

    感谢上外静中任淳同学提供   uses crt; label   h;         //h是重新开始游戏 const   y1=18;   y2=18;       //p1,p2的纵坐标 var ...

  10. [CF148E] Porcelain (分组背包)

    题目链接:http://codeforces.com/problemset/problem/148/E 题目大意:有n组数据,每次可以从任意一组的两端取出1个数,问你取m个数最大能组成多少? 思路:先 ...