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

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