CoreData 手动自动 创建context(上下文)

方法一:自定义context

 上下文关连数据库,model模型文件
       NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];
        持久化,把数据保存到一个文件,而不是内存
        NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        
         告诉Coredata数据库的名字和路径
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        
       NSString *sqlitePath = [doc stringByAppendingPathComponent:@"YQHItList.sqlite"];
        [store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[NSURL fileURLWithPath:sqlitePath] options:nil error:nil];
        
        _context.persistentStoreCoordinator = store;
    

方法二:系统自动生成(在AppDelegate内部)然后其他类里面进行调用:

   怎么 取到context?
    AppDelegate*appDelegate=[[UIApplication sharedApplication]delegate];
    self.context=appDelegate.managedObjectContext;
因为下面程序也要使用到
    

数据保存

什么时候进行数据保存,要根据你自己的程序来
//确认按钮
    UIAlertAction *okAction=[UIAlertAction actionWithTitle:@"确认添加" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
          //实例化实体类
        YQPerson *person =[NSEntityDescription insertNewObjectForEntityForName:@"YQPerson" inManagedObjectContext:_context ];
//    给实体类的name赋值
        person.name=[alert.textFields[0] text];
        NSError*error=nil;
        [_context save:&error];
        NSLog(@"%@",person.name);
        
        
        //判断如果出错
        if (error) {
            NSLog(@"%@",person.name);
        }
        //将数据降入可变数组
        [_mutable addObject:person.name];
        
        //刷新数据(全局刷新)
        [self.tableView reloadData];
    
    }];

这里我是在点击一个按钮弹出alert框内部可以输入text,在我点击确定按钮的时候进行数据保存

数据查询(从你保存的里面取出来,下一次运行程序时还能显示在屏幕上)

请求
        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"YQPerson"];
       
        NSError *error = nil;
        从coredata中查找出数据 存入一个数组
        NSArray *ps= [_context executeFetchRequest:request error:&error];
        ;
        NSLog(@"%@",[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"YQHItList.sqlite"]);
        NSLog(@"%@",ps);
        if (error) {
            NSLog(@"error");
        }
        
        _mutable = [NSMutableArray array];
注意二:这一步不能少,少了之后系统不能识别我们这个是什么东西 ,必须借用一个新对象然后等价于我们这个数组才可以进行下一步操作
    [_mutable removeAllObjects];
    快速查询对应name 存入可变数组用于界面显示
        for (YQPerson *p in ps) {
            [_mutable addObject:p.name];
        }
        NSLog(@"%@",_mutable);

方法二怎么自动生成的步骤就不提了 ,可以去其他帖子看一下,我这里只是简单做一下笔记,因为我之前做这个简单的项目的时候遇到了比较难发现的问题: 能存进去但是取不出来

能存context save: 是成功的,但是fetch的时候就不成功了...

1.viewDidLoad中我[self fetch];操作放在了context获取操作之前了 ,这样就不能根据context 来获取你保存的东西了 记住

你可能感兴趣的:(CoreData 手动自动 创建context(上下文))