您的位置:首页 > 移动开发 > IOS开发

iOS之学习CoreData的笔记

2015-08-08 01:02 465 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/zhiselfly/article/details/47349773

其实很早之前就接触过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];


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: