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

// 使用前需要引入 注意是<>括号,不是双引号
#import <sqlite3.h>

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

转载于:https://www.cnblogs.com/gaozhang12345/p/5992640.html

iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用相关推荐

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

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

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

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

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

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

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

    iOS开发UI篇-UIWindow简单介绍 一.简单介绍 UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow iOS程序启动完毕后,创建的第一个视图控件就是UIWi ...

  5. iOS开发拓展篇-XMPP简单介绍

    iOS开发拓展篇-XMPP简单介绍 一.即时通讯简单介绍 1.简单说明 即时通讯技术(IM)支持用户在线实时交谈.如果要发送一条信息,用户需要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双 ...

  6. iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)

    图像:  1.图片浏览控件MWPhotoBrowser 实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作.  ...

  7. (转)iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)

    图像: 1.图片浏览控件MWPhotoBrowser  实现了一个照片浏览器类似 iOS 自带的相册应用,可显示来自手机的图片或者是网络图片,可自动从网络下载图片并进行缓存.可对图片进行缩放等操作. ...

  8. iOS开发-常用第三方开源框架介绍(2)

    2019独角兽企业重金招聘Python工程师标准>>> Frank 自动化测试工具?  superdb 一个Debuger工具 用命令行调试..  iOS-Hierarchy-Vie ...

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

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过& ...

最新文章

  1. #Sora#OpenStack基础库oslo.config试用总结
  2. java类结构图_java 集合类结构图
  3. cad线性标注命令_CAD常用标注快捷键和命令
  4. HALCON示例程序inner_rectangle1.hdev木板有效区域提取
  5. MacOS 的软件包管理工具 MacPorts
  6. 【转】!C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别
  7. linux在线扩展文件系统空间ext2online
  8. dvd在线租赁问题 matlab,DVD在线租赁问题.doc
  9. python能做什么工作-python语言能做什么工作
  10. 百度视频播放器android,百度视频播放器
  11. 机器学习基础知识之概率论基础详解
  12. MATLAB-蒙特卡罗方法
  13. c语言程序设计问号是什么意思,在C语言中,该语句在z=xy?x:y中是什么意思,问号表示什么意思...
  14. 使用记录6_发布微信小游戏
  15. cesium实时获取卫星的动态信息,包括经纬度和名称(onTick)
  16. 大数据与机器学习-大数据预测
  17. python爬虫,矢量数据地铁线路获取
  18. 2012 成都网络赛小记
  19. MATLAB编程之PSYCHTOOLBOX(PTB):展示实验介绍等待按空格键进行下一步实验
  20. OSG第三方库编译之二十五:webp编译(Windows、Linux、Macos环境下编译)

热门文章

  1. 2022-2028年中国二次元行业深度调研及投资前景预测报告
  2. 第一个spring程序
  3. django自带的分页功能
  4. 遇事不责怪别人,换位思考能成全更好的自己
  5. 【B/S实践】解决:vs中修改样式表后不起作用的问题
  6. Python 属性__getattribute__
  7. fastbert解读
  8. Android数据持久化:SharePreference
  9. 自动驾驶传感器比较:激光雷达(LiDAR) vs. 雷达(RADAR)
  10. PyTorch Data Parrallel数据并行