操作过程

  • Context想要获取值,先要告诉连接器,我要什么东西
  • 链接器再告诉store, 你给我什么东西, store去找
  • 找到之后返回给链接器,链接器再返回给Context               

CoreData和sqlite的区别

  • CoreData是一个框架;sqlite是苹果使用别人开发好的一个动态库,本质是关系型数据库.

  • CoreData是IOS平台下的一个数据持久化的方式;sqlite可以跨平台使用.

实现思路

  •   首先找到CoreData文件夹
  •   创建Person类,并且建立name属性

Command + N 创建

//代码实现

-------ViewController.h

#import "ViewController.h"
//coreData的框架
//导入框架的方式 : <框架名字/头文件名字>
#import <CoreData/CoreData.h>
#import "Person.h"
#import "AppDelegate.h" @interface ViewController ()<UITableViewDelegate, UITableViewDataSource> @property (nonatomic, strong) UITableView *tableView;
//临时数据库
@property (nonatomic, strong) NSManagedObjectContext *objectContext;
//数据源数组
@property (nonatomic, strong) NSMutableArray *dataArray; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.dataArray = [NSMutableArray array];
//获取到我们最开始使用的AppDelegate
AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;
self.objectContext = app.managedObjectContext; //调用查询数据的方法
[self searchAll]; _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
[self.view addSubview:_tableView];
_tableView.delegate = self;
_tableView.dataSource = self;
[_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"]; self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:(UIBarButtonSystemItemAdd) target:self action:@selector(barButtonItemClicked)]; } - (void)barButtonItemClicked
{
//NSEntityDescription : 实体描述类,通过类方法创建
//第一个参数 : 表示这个实体描述类描述的是哪个实体 (表名)
//第二个参数 : 表示的是在context里边创建一个描述,告诉context我要往里面插入一个object了
NSEntityDescription *description = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.objectContext];
//创建一个实体类
//第一个参数 : 实体描述
//第二个参数 : 在context里面放入这个类
Person *person = [[Person alloc] initWithEntity:description insertIntoManagedObjectContext:self.objectContext]; int number = arc4random() % ;
person.name = [NSString stringWithFormat:@"%d号李四", number]; [self insertObject:person]; } //向coreData中插入一条数据
- (void)insertObject:(Person *)person
{ NSError *error = nil;
//把context保存到本地
//这个方法执行之后, 本地数据才发生了改变
[self.objectContext save:&error]; if (error == nil) {
[self.dataArray addObject:person];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.dataArray.count - inSection:];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
}
} //搜索全部
- (void)searchAll
{
//创建一个查询操作, 查询哪个表里面的内容
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"]; //接收查询数据
NSError *error = nil;
//让context去执行查询操作, 并且返回一个结果数组
NSArray *array = [self.objectContext executeFetchRequest:request error:&error]; //判断error是否为nul
if (error == nil) {
[self.dataArray setArray:array]; [self.tableView reloadData];
}else
{
NSLog(@"查询失败 ");
}
} - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
//判断一下当前的编辑状态
if (editingStyle == UITableViewCellEditingStyleDelete) {
//获取到想要删除的那条数据
Person *person = self.dataArray[indexPath.row];
//在context中将这条数据删除
[self.objectContext deleteObject:person]; NSError *error = nil; [self.objectContext save:&error]; if (error == nil) {
//先删数据
[self.dataArray removeObject:person];
//然后更新UI
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
}
}
} - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//知道要改谁
Person *person = self.dataArray[indexPath.row]; int number = arc4random() % ;
person.name = [NSString stringWithFormat:@"%d号张三", number]; NSError *error = nil; [self.objectContext save:&error]; if (error == nil) {
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationFade)];
}
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"forIndexPath:indexPath];
Person *person = self.dataArray[indexPath.row];
cell.textLabel.text = person.name; return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

CoreData __ 基本原理的更多相关文章

  1. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  2. Android自定义控件之基本原理

    前言: 在日常的Android开发中会经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件,今天先大致了解一下自定义控件的要求和实现的基本原理. 自 ...

  3. iOS基本数据库存储方式 - CoreData

    CoreData 创建模型文件的过程 1.选择模板 2.添加实体 3.添加实体的属性[注意]属性的首字母必须小写 一.CoreData管理类(必备以下三个类对象) 1.CoreData数据操作的上下文 ...

  4. HMM基本原理及其实现(隐马尔科夫模型)

    HMM(隐马尔科夫模型)基本原理及其实现 HMM基本原理 Markov链:如果一个过程的“将来”仅依赖“现在”而不依赖“过去”,则此过程具有马尔可夫性,或称此过程为马尔可夫过程.马尔可夫链是时间和状态 ...

  5. 动态令牌-(OTP,HOTP,TOTP)-基本原理

    名词解释和基本介绍 OTP 是 One-Time Password的简写,表示一次性密码. HOTP 是HMAC-based One-Time Password的简写,表示基于HMAC算法加密的一次性 ...

  6. iOS CoreData 中 objectID 的不变性

    关于 CoreData的 objectID 官方文档有这样的表述:新建的Object还没保存到持久化存储上,那么它的objectID是临时id,而保存之后,就是持久化的id,不会再变化了. 那么,我想 ...

  7. ZooKeeper基本原理

    ZooKeeper简介 ZooKeeper是一个开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等. ZooKeeper设计目的 1. ...

  8. iOS CoreData primitive accessor

    Given an entity with an attribute firstName, Core Data automatically generates firstName, setFirstNa ...

  9. 初识CoreData与详解

    Core Data数据持久化是对SQLite的一个升级,它是iOS集成的,在说Core Data之前,我们先说说在CoreData中使用的几个类. (1)NSManagedObjectModel(被管 ...

随机推荐

  1. Mac OS sierra app is damaged

    想升级系统,然后发生如题错误,谷歌之,解决方法如下(希望帮助大家): Step 1. Go to your applications folder. Step 2. Find the installe ...

  2. Hybrid APP混合开发的一些经验和总结

    http://www.cnblogs.com/kingplus/p/5588339.html 写在前面: 由于业务需要,接触到一个Hybrid APP混合开发的项目.当时是第一次接触混合开发,有一些经 ...

  3. Mysql 常用 SQL 语句集锦

    Mysql 常用 SQL 语句集锦 基础篇 //查询时间,友好提示 $sql = "select date_format(create_time, '%Y-%m-%d') as day fr ...

  4. MyBatis源码分析(3)—— Cache接口以及实现

    @(MyBatis)[Cache] MyBatis源码分析--Cache接口以及实现 Cache接口 MyBatis中的Cache以SPI实现,给需要集成其它Cache或者自定义Cache提供了接口. ...

  5. svn强制加注释才能提交

    进入库的hooks目录下 cp pre-commit.tmpl pre-commit 并对pre-commit加入运行权限 修改pre-commit内容如下 REPOS="$1" ...

  6. iOS 中的 promise 模式

    1.概述 异步编程 App 开发中用得非常频繁,但异步请求后的操作却比较麻烦.Promise 就是解决这一问题的编程模型.其适用于 延迟(deferred) 计算和 异步(asynchronous)  ...

  7. RN8209校正软件开发心得(1)

    最近领导突然让我做软件了,头大啊.以前也没怎么自己独立做过软件,这次来的突然啊,面对这么大的任务量自己只能加把劲了,还等着领导给涨工资呢,哈哈... 作为编程的小白,要自己做一款上位机的软件实属不易啊 ...

  8. clearfix的应用

    之前遇到一个问题,引用Bootstrap框架时 一行显示四个模块,小屏幕时显示两个模块 当内容一样时,大小屏幕时一样的,但是当其中一个和另一个内容不同时,展示效果就会有错乱 <div class ...

  9. Android6.0权限组申请

    void checkPermission() { final List<String> permissionsList = new ArrayList<>(); if (Bui ...

  10. zabbix自定义key

    zabbix自定义key 1.修改客户端配置文件 #vi /opt/zabbix/etc/zabbix_agentd.conf Include=/opt/zabbix/etc/zabbix_agent ...