iOS之学习CoreData的笔记
其实很早之前就接触过CoreData,但是实际开发的时候用的还是直接操作SQL语句多,毕竟我现在只是学生一枚,有时候还会去接点个人兼职的外包做,学习iOS只能用课余时间,今天就认真的去研究一下这个CoreData的用法。
对于CoreData,XCode在创建项目的时候只要打个勾勾,创建项目的时候就会在AppDelegate里面生成CoreData要用到的一些东东,抽个时间我也得去认真理解一下里面的东东。
于是乎我就创建了一个新项目,理所当然的勾上了CoreData的单选框,然后直接在ViewController里面写着玩。。。。
首先,要把AppDelegate的实例给拿到,我看到过很多网上的文章都喜欢在AppDelegate上面声明一个静态变量,然后Controller直接去获取,我觉得这是破坏编程风格的行为,所以个人也比较反感这种做法,那么问题来了,挖掘机哪家强。?。。。。。
开个玩笑哈。。。问题是,怎样获取这个AppDelegate,如果这又动用搜索引擎,真的很没劲的事情,反正我又不是在赶什么项目,所以我认为,这种东西还是靠自己去琢磨,反正XCode本来就有一个很强大的代码提示,也有官方的帮助文档,我认为只有自己钻研出来的东西印象才会是最深刻的。。。。。
综上所述。研究了很多种方法之后。得出如下代码。
首先,你得把AppDelegate的头文件导入吧。
#import "AppDelegate.h"然后,酱紫,就能够完美的,不通过在AppDelegate里加入奇怪的静态变量就能够获取到当前的代理。
AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];
能获取这个东东就能慢慢开玩了。
做个数据库都知道,要想开玩数据库,怎样你都得创建个数据表吧。
于是乎,就创建了User这个Entity,照我自己的理解,我认为这其实不就是一个数据表一样的东西么,Attribute感觉就是数据表里的字段名,Type就不用解释吧。
好了,这样之后,数据表就创建好了,都说ORM能够把数据库转换成模型,所以,第二步,是不是应该创建一个数据模型的类捏。
因为数据表名是User。所以数据模型的名称也叫User好了这是我之前折腾CoreData时候看到别人的做法
//User.h #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @interface User : NSManagedObject @property (nonatomic, copy) NSString* username;/**< 用户名 */ @property (nonatomic, copy) NSString* password;/**< 密码 */ @end
//User.m #import "User.h" @implementation User @dynamic username; @dynamic password; @end
@dynamic这个东东其实就是告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成,但我们也不会在.m文件里面去实现他,只是让它默默的空着,当然,如果你去把这个实例创建,去设置获取获取username和password的值,铁定会直接崩掉的。
好了,然后这个不得不说为什么要继承NSManagedObject,其实到这里为止还有一步要做的
你要在CONFIGURATIONS里的Default找到你创建的Entity,然后设置Class为你的数据模型
好了,废话了那么多,继续敲代码吧。。。
首先先得获得NSManagedObjectContext这个东东,这东东在AppDelegate里面已经给了懒加载的方法,所以就能直接的获取到了,
这个东西就是跟数据库连接着的一个对象,你无论查询数据,修改数据,插入数据都得靠这个对象
所以。首先,我们先来往这个数据库插点东西进去了,当然不会是黄瓜。。。。。
那么要怎么插捏,当初我自己琢磨了大半天,还是没搞懂怎么插,最后还是动用了度娘才知道。
NSManagedObjectContext* mgr = appDelegate.managedObjectContext; //如果在这之后NSLog(@"%@", NSStringFromClass([insertObject class]))的话会打印出User。 //这就是为什么要在CONFIGURATIONS设置Entity的Class的原因,而且也是为什么要继承NSManagedObject的原因 User* insertObject = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:mgr]; insertObject.username = @"hello"; insertObject.password = @"world";当程序运行到这里,已经在 内存中 增加了一个新的数据行,当并没有实质的保存到物理介质中
所以为了保存,我们还得加那么一句
[appDelegate saveContext];当然,这个是XCode生成项目的时候给我们生成的在AppDelegate里的一个方法,你也可以拿下面这种方法来进行将数据保存到物理介质中
NSError* err; //如果你不知道mgr这个变量怎么来的,请看前面的代码片段 [mgr save:&err];
到这里为止,就是很简单的插入数据的过程,灰常简单和直白。
既然我们研究清楚了怎样用CoreData往数据表里面插入数据,那接下来的问题就是当我的App要取数据的时候要怎么取,还有转换成数据模型的事。
这里不废话,直接上代码
//这一句可以看作你要查询数据库里面的哪一个表 NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; //同过NSManagedObjectContext来查询数据库来的全部数据,然后再遍历打印一遍 NSArray* result = [mgr executeFetchRequest:req error:nil]; for(User* i in result) { NSLog(@"username=%@, password=%@", i.username, i.password); }
但是我们在实际的开发环境的时候,总不可能会每次都把全部数据取出来,这样首先效率就不好了,而且还得麻烦的自己敲筛选代码,所以CoreData为了解决这个问题,可以使用一个叫NSPredicate 的东西,里面放的东西,有点像SQL查询语句里的where块
//相当于 SELECT * FROM User WHERE username='hello' NSPredicate* predict = [NSPredicate predicateWithFormat:@"username=%@", @"hello"]; NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; req.predicate = predict; NSArray* result = [mgr executeFetchRequest:req error:nil]; for(User* i in result) { NSLog(@"username=%@, password=%@", i.username, i.password); }
例如LIKE也能用,只不过%变成了*
//相当于SELECT * FROM User WHERE username like '%ll%' NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; req.predicate = [NSPredicate predicateWithFormat:@"username like %@", @"*ll*"]; NSArray* result = [mgr executeFetchRequest:req error:nil]; for(User* i in result) { NSLog(@"username=%@, password=%@", i.username, i.password); }
and、or这些也能用上
//相当于SELECT * FROM User WHERE username like '%ll%' and password='world' NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; req.predicate = [NSPredicate predicateWithFormat:@"username like %@ and password=%@", @"*ll*", @"world"]; NSArray* result = [mgr executeFetchRequest:req error:nil]; for(User* i in result) { NSLog(@"username=%@, password=%@", i.username, i.password); }既然我们能插入数据,就需要修改数据,修改数据的方法也非常简单,首先你要通过executeFetchRequest找到你要改的数据
然后直接在返回的数据模型上修改,之后调用appDelegate上生成的saveContext或者mgr的save方法就完成数据修改
//相当于UPDATE User SET password='my world' WHERE username='hello' NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; req.predicate = [NSPredicate predicateWithFormat:@"username=%@", @"hello"]; NSArray* result = [mgr executeFetchRequest:req error:nil]; for(MUser* i in result) { i.password = @"my world"; NSLog(@"username=%@, password=%@", i.username, i.password); } [appDelegate saveContext];
这里是删除数据的方法
//相当于DELETE FROM User WHERE username='hello' NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"User"]; req.predicate = [NSPredicate predicateWithFormat:@"username=%@", @"hello"]; NSArray* result = [mgr executeFetchRequest:req error:nil]; for(User* i in result) { [mgr deleteObject:i]; } [appDelegate saveContext];
- IOS学习笔记16——Core Data
- iOS学习笔记--Core Data的使用
- iOS学习笔记14(1)—Core Data简单介绍和实现
- iOS学习笔记18-CoreData你懂的
- iOS学习笔记18-CoreData你懂的
- 【IOS学习】Core Graphics 框架学习笔记,以及demo
- IOS Core Animation Advanced Techniques的学习笔记(二)
- iOS学习笔记之QuartzCore框架
- 【Swift学习笔记-《PRODUCT》读书记录-CoreData数据存储】
- iOS CoreData 笔记
- IOS Core Animation Advanced Techniques的学习笔记(一)
- iOS 7应用开发公开课笔记 L12:Documents and Core Data
- IOS Core Animation Advanced Techniques的学习笔记(一)
- IOS学习高级课程(二)coredata
- 【IOS学习】Core Audio 学习笔记
- iOS学习- 23 Core Data by Tutorials - CH03
- iOS学习笔记之CoreGraphics框架
- IOS Core Animation Advanced Techniques的学习笔记(二)
- iOS学习笔记之QuartzCore框架
- iOS学习笔记 地图(一)定位CoreLocation