美文网首页
学会用CoreData,发现真的好用

学会用CoreData,发现真的好用

作者: 大猿媛 | 来源:发表于2017-04-15 15:43 被阅读208次

CoreData

CoreData是苹果系统提供的一套数据本地存储API,提供了一个强大的近自动化的存储方式,我们不用关心内部怎么存储,怎么删除,怎么查找,只需要提供存储路径,存储方式,执行增删改查的命令就行了,那CoreData是怎么做到这些的呢?

API提供了几个相关类,也就是CoreData的核心框架Core Data Stack,有NSManagedObjectContext、NSPersistentStoreCoordinate和NSManagedObjectModel:

NSManagedObjectContext 是CoreData存储管理上下文,负责整个app的数据操作;
NSPersistentStoreCoordinate负责NSManagedObjectModel的存储,定义了存储数据的方式,路径及存储策略;
NSManagedObjectModel被管理的对象模型,就是我们创建coreData生成的.xcdatamodel文件;

下面通过这三个重要类的定义,我们详细的看看其作用,首先_managedObjectModel定义了app内要操作的coredata文件是yingshibao.momd,其实就是.xcdatamodel文件,_persistentStoreCoordinator定义了存储的文件类型是NSSQLiteStoreType数据库,其次指定了存储的model是_managedObjectModel,这就把app内和沙盒联系起来了,最后一个就是NSManagedObjectContext,对数据的操作就通过传入的NSManagedObjectContext参数来确定操纵的是哪一个存储上下文

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"yingshibao.sqlite"];
    NSError *error = nil;
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"yingshibao" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: _managedObjectModel];
    
    NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption : [NSNumber numberWithBool:YES],
                              NSInferMappingModelAutomaticallyOption : [NSNumber numberWithBool:YES]};
    if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
        NSAssert(0, @"数据库表结构有变化,删除重新测试");
    }

    if (coordinator != nil) {
        _managedObjectContext = [[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

下方图中解释了这三者之间的工作关系


20160711190941786.jpeg

通常一个项目里我们只使用一个数据库就搞定本地持久化了, 而实际项目中,有时候需要将不同业务的数据存储在不同的沙盒位置,这时候我们可以通过创建多个context上下文,去对应多个沙盒位置,但是用同一个NSPersistentStoreCoordinator就可以,因为NSPersistentStoreCoordinator可以添加多个NSPersistentStore来负责NSManagedObjectModel的存储,

//每执行一次这个代码就为_persistentStoreCoordinator添加一个NSPersistentStore,每个NSPersistentStore对应一种存储(一个存储路径和一种存储文件类型)
[_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]
20160711191002361.jpeg

使用

增:每一个data model对应一个NSEntityDescription对象,NSEntityDescription对象包含了Entity所拥有的属性,关系等信息,我们可以通过NSEntityDescription生成相应的NSManagedObject的实体

Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
student.name = @"李四";
[context save];

查:NSFetchRequest负责查询,可以定义查询条件和结果排序规则

 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@","李四"];
 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
 [request setPredicate:predicate];
 [request setSortDescriptors:@[sort]];
 NSArray *result = [context executeFetchRequest:request error:nil];

删: 删的前提是查找,继查找之后

for (Student *stu in result) {
        [context deleteObject:stu];
    }
//别忘记保存
[context save:nil];

改: 改的前提也是查找,继查找之后

stu.name = @"张三";
//别忘记保存
[context save:nil];

另外一个简便的获取展示的列表数据的类NSFetchedResultsController,初始化的过程就是查询的过程,通过这个类可以直接访问查询结果,包括列表分区展示等

NSFetchedResultsController *vc = [[NSFetchedResultsController alloc]initWithFetchRequest:request   managedObjectContext:context sectionNameKeyPath:@"以哪个字段分区展示如 age" cacheName:nil];
//获取分区信息
vc.sections
NSFetchedResultsSectionInfo *sectionInfo = vc.sections[0];
sectionInfo.name
//数据
vc.fetchedObjects
[vc objectAtIndexPath:indexPath];

相关文章

  • 学会用CoreData,发现真的好用

    CoreData CoreData是苹果系统提供的一套数据本地存储API,提供了一个强大的近自动化的存储方式,我们...

  • Coredata和FMDB性能对比,原来差距这么大

    对于这两个持久化框架一直存在争议,公司里的项目一直都是会用coredata,一直对coredata印象还不错,再加...

  • 第五篇:CoreData

    CoreData 初识CoreData 基础使用CoreData 高级使用CoreData 使用进阶CoreDat...

  • CoreData初级使用教程

    iOS中的CoreData用起来很是方便,比起SQLite又臭又长而且容易出错的语句简直不能再好用,这也是苹果官方...

  • (第88天)好心未必有好的回应

    这段时间学中医,我每天跟着老师学习,同时用老师研发的产品之后,发现真的很好用。比如说:我以前睡眠,每次睡了起来后,...

  • tensorflow1.13+python3.7+anconda

    首先谈谈anaconda,这个玩意真的好用,但不会用真的难受。 第一步,打开prompt 第二步新建一个环境,这里...

  • 五款神奇的浏览器,比QQ、UC更好用!

    在使用电脑的时候我们免不了会用到浏览器,那么你真的知道哪些浏览器好用吗?下面整理了全网最好用的5个殿堂级浏览器,总...

  • 发现 每日计划真的很好用!

    近一周发现自己每天睡前都会例好每日计划然后去完成它,一天下来,很充实,感觉没有虚度年华。说说今天吧…… ...

  • 2018-07-11 FMDB使用

    之前都是直接用sqlite 的C语言API,感觉也没有什么不好用的,就是封装性不好,不能重用;CoreData也用...

  • cocoapods的安装,使用,卸载

    首先, 不会用cocoapods的话如过你接手某些新项目是用cocoapods写的你会疯, 其次他真的很好用, 当...

网友评论

      本文标题:学会用CoreData,发现真的好用

      本文链接:https://www.haomeiwen.com/subject/flkgattx.html