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 }

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. RabbitMQ 安装

    Install Erlang from the Erlang Solutions repository or Follow the instructions under "Installat ...

  2. Visual Tracker Benchmark

    直接的方法: 首先将代码先拷到benchmark_v1.0/tackers/这个文件夹下,你会发现里面已有好几个算法的代码文件夹了. 这边注意了,我就是这样的,没有注意把代码拷贝进去之后要自己写一个调 ...

  3. Linxu IO测试软件

    fio 安装 apt-get install fio fdisk -l Device Boot Start End Blocks Id System/dev/sda1 * 2048 968390655 ...

  4. .NET 环境中使用RabbitMQ(转)

    在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短信 ...

  5. EXT 省市三级联动及默认选择

    var provinceStore = Ext.create('Ext.data.Store', { fields: ['id', 'name'], proxy: { type: 'ajax', ur ...

  6. work flow

  7. JMeter压力测试以文件的形式

    JMeter压力测试入门教程[图文] 1. 下载JMeter 2. 启动JMeter 3. 运行预准备 4. 运行 文章目录 Apache JMeter是Apache组织开发的基于Java的压力测试工 ...

  8. 调用jar程序,读取与jar同级的配置文件。

    System.getProperty("user.dir") + "\\Mysettings.properties";//该方法在Alimonitor里取不到绝 ...

  9. go中方法的接收者是值或者指针的区别

    值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string } func (t T) M1() { t.Name = "name1" ...

  10. WEB-INF下jsp跳转

    今天才知道:浏览器是不允许直接访问WEB-INF文件夹的 瞬间感觉自己好shi的有没有,纠结了2天 看来还得通过springMVC来跳,,,