iOS学习之CoreData的增删改查

坚持 成长 每日一篇

Coredata是iOS5之后添加的框架,使用Coredata我们可以很方便的实现对象的持久化存储。
注意:持久化:把数据保存到一个文件,而不是内存

使用前准备

使用coredata之前我们需要做一些配置
这里写图片描述
1.创建一个模型文件(文件格式为xcdatamodeld,如Model.xcdatamodeld)。相当于创建一个数据库,里面可以存放很多表。
这里写图片描述
2.选中模型文件,点击这里写图片描述添加实体。也就是创建一个表,并配置好如图属性
这里写图片描述
3.创建实体类。相当于模型,这里就是创建一个继承NSManagedObject的类
new一个根据Model.xcdatamodeld的Entity表创建一个NSManagedObject的类。如图
这里写图片描述
创建完之后我们就在工程里会看到Entity类,它继承自NSManagedObject。

4.创建与数据库关联的上下文,在我们需要的使用到CoreData的.m文如下代码,这里我是在控制器.m文件里测试。

#import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Entity.h"
@interface ViewController ()
{
    NSManagedObjectContext *_context;
}
@end
@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//1.创建一个模型文件。相当于创建一个数据库表,
//2.添加实体。也就是给表创建一个实体
//3.创建实体类。相当于模型
//4.生成上下文 关联模型文件生成数据库。 必须有一个对象关联上下文
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    //model 模型文件
    NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
    //持久化存储调度器
    NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
    //找到数据库要存放的目录
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    //设置数据库文件名和路径,这里company.sqlite也可以写成company.db
    NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"];
    NSLog(@"sqlitePath=%@",sqlitePath);
    //告诉Coredata存储到数据库的名字和路径
    //NSSQLiteStoreType表示放在sqlite文件里
    [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:nil];
     //上下文关联数据库
    context.persistentStoreCoordinator = store;
    _context = context;
    // Do any additional setup after loading the view, typically from a nib.
}

注:Coredata框架也是基于对Sqlite数据库的操作完成
配置好了上下文,之后我们就可以通过对上下问的操作来访问Sqlite了。

插入对象

插入对象我们不能通过alloc来创建对象,需要通过NSEntityDescription来创建对象

-(IBAction)add
{
    //Entity指的是CoreData文件下的表名
    Entity *e = [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:_context];
    e.data = [[NSData alloc] init];
    e.name = @"李斯";
    e.height = @33;
    NSError *error;
    //完成上面的操作只是保存在上下文里,只有通过调用save:方法后才会刷新sqlite上的记录
    [_context save:&error];
    if (error) {
        NSLog(@"%@",error);
    }
}

获取对象

获取sqlite里面的对象我们需要通过发起fetch Request请求来获取,在request里面我们还可以设置过滤的条件和排序的方式。

-(IBAction)read
{
    //通过fetch Request:抓取请求对象
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
    //设置过滤条件,如果没有设置过滤请求,会获取所有的对象
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"李斯"];
    request.predicate = pre;
    //设置排序 sort 排序  ascending:升序 yes表示生序,no表示降序
    NSSortDescriptor *heightSort =[NSSortDescriptor sortDescriptorWithKey:@"height" ascending:NO];
    request.sortDescriptors = @[heightSort];
    //执行抓取请求
    NSError *error;

    NSArray *array = [_context executeFetchRequest:request error:&error];
    if (error) {
        NSLog(@"error = %@",error);
    }
    for (Entity *e in array) {
        NSLog(@"e.name = %@,height = %@",e.name,e.height);
    }
}

更新对象

更新对象前我们必须先获取我们要更新的对象

-(IBAction)update
{
    //操作:将所有名为李斯纪录改为名为王五的纪录
    //1.获取对象所有名为李斯的记录
        //通过fetch Request:抓取请求对象
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
        //获取所有名为李斯的记录
        NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"李斯"];
        request.predicate = pre;
        //执行抓取请求
        NSError *error;
        NSArray *array = [_context executeFetchRequest:request error:&error];
        if (error) {
            NSLog(@"error = %@",error);
        }
    //2.修改纪录的值为王五
        for (Entity *e in array) {
            e.name = @"王五";
        }
   //3.保存上下文到sqlite
        [_context save:nil];
}

删除对象

删除对象只有完成了save:方法后sqlite才真正的完成删除。

-(IBAction)delete
{  //操作:将身高为12的纪录删除
    //1.获取身高为12的纪录
    //通过fetch Request:抓取请求对象
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Entity"];
    //获取所有名为李斯的记录
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"height = %@",@"12"];
    request.predicate = pre;
    //执行抓取请求
    NSError *error;
    NSArray *array = [_context executeFetchRequest:request error:&error];
    if (error) {
        NSLog(@"error = %@",error);
    }
    //2.删除记录,这里只是将上下中的对象删除
    for (Entity *e in array) {
        [_context deleteObject:e];
    }
    //3.保存,只有保存之后,数据库中的内容才会同时删除
    [_context save:nil];

}

小结

什么时候使用COredata 什么时候使用FMDatabases
CoreData 在公司使用的比较少,用户的比较多的是FMDatabases

数据存储的结构比较简单的时候,使用CoreData
CoreData开发效率会高点,因为它是面向对象,而且不用写sql语句。

FMDatabases 数据结果比较复杂的时候,表与表之前的关联比较多的时候使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值