IOS开发 core data  简单使用和注意


1. 创建CoreData 命名Model 

创建方式:command+N->ios/coredate->DataModel

2.生成NSManagedObject SubClass

创建方式:command+N->ios/coredate->NSManagedObject SubClass

3.CoreData简单使用

 CoreData常用的几个类

  • NSManagedObjectContext         MOC 托管对象上下文,各种操作都需要这个类
  • NSPersistentStoreCoordinator   PSC  持久化调度器,协调上下文和存储区区之间关系,数据库路径,数据库升级都要通过psc配置
  • NSManagedObjectModel           MOM 托管对象模型,对应一个模型文件,存储数据库中的数据结构

 CoreData初始化

       // 初始化上下文
       NSManagedObjectContext *_MainContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];

       // 初始化模型文件 
       NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; 

       // 持久化存储调度器 
       NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

       //设置数据库存储路径 
       NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSLog(@"%@",doc); NSString *sqlitePath = [doc stringByAppendingPathComponent:@"company.sqlite"]; NSError *error = nil;

       //当数据结构发生变化时,用户app只能升级,不能卸载重装,需要配置一下
       NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
        
       //数据存储的类型 数据库存储路径
       [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:optionsDictionary error:&error]; _MainContext.persistentStoreCoordinator = store;


 
CoreData查询 

   <pre name="code" class="objc">        NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
        
        //设置查询条件
        fetchRequest.predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"hxID='%@'",username]];
        
        //设置查询结果数量为20条
        [fetchRequest setFetchLimit:20];
        
        //设置查询结果偏移量
        [fetchRequest setFetchOffset:10];
        
        //设置要查询Entity名称,上下文
        NSEntityDescription *entity = [NSEntityDescription entityForName:@"HxInfo" inManagedObjectContext:cusMoc1];
        [fetchRequest setEntity:entity];
        
        //开始查询,
        NSError *error;
        NSArray *fetchedObjects = [cusMoc1 executeFetchRequest:fetchRequest error:&error];
        if (!error) {
            NSLog(@"查询到数据了");
        }

 

CoreData插入数据

           //初始化一个Entity类
           NSError *error;
           GroupInfoM *myGroupInfo = [NSEntityDescription insertNewObjectForEntityForName:@"HxInfo" inManagedObjectContext:_MainContext];
                            
           //给对象赋值
           myGroupInfo.groupId = @"1234";
           myGroupInfo.groupName = @"快乐的生活";
                            
           //保存到数据库
           [cusMoc1 save:&error];
                            
           if (!error) {
               NSLog(@"保存成功");
           }

CoreData多线程应用

  • 当写入和查询同时进行,尤其是同时对一个Entity进行操作时,会造成app闪退,原因是:你查询这条数据后,Entity同一条数据内容更新了
  • 苹果官方给的解决方案,每个线程有自己独立的MOC,所有的MOC公用一个PSC
  • 说一下是我自己项目的,新建一个主的MOC,执行异步的插入,删除,更新操作,多个子的MOC,执行查询

            //从当前调用事件的线程中得到对应的NSManagedObjectContext
            NSManagedObjectContext* threadContext = [[NSThread currentThread].threadDictionary objectForKey:[NSThread currentThread].name];
            
            //第一次调用时,创建一个新的NSManagedObjectContext
            if (!threadContext) {
                //疑问1:NSPrivateQueueConcurrencyType这个起什么作用
                threadContext = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSPrivateQueueConcurrencyType];
                
                //设置threadContext的父的MOC
                [threadContext setParentContext:_MainContext];
                
                //把threadContext放入到对应的线程中
                [[NSThread currentThread].threadDictionary setObject:threadContext forKey:[NSThread currentThread].name];
            }
            
            //查询使用threadContext



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值