CoreData的学习
第一步:创建项目是勾选coredata,当然创建的时候没有勾选,之后还可以手动生产,
然后:创建数据库模型,及为其添加模型的属性。
然后生成模型文件:
注意⚠️:首先设置为Manual/None 不然在编译的过程中也会自动生成模型文件 造成编译失败
模型文件生成后,不用做修改,
生成模型文件后,就可以使用了。
现在就开始上代码:
#import "ViewController.h"
#import "AppDelegate.h"
#import "Person+CoreDataClass.h" @interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, strong) UITableView * tableView;
@property (nonatomic, strong) NSMutableArray * dataSource;
@property (nonatomic, strong) AppDelegate * myAppdelegate; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
// 初始化数据源数组
self.dataSource = [NSMutableArray array]; self.tableView = [[UITableView alloc]initWithFrame:self.view.bounds];
self.tableView.delegate = self;
self.tableView.dataSource = self;
[self.view addSubview:self.tableView];
self.tableView.rowHeight = ; UIButton *add = [UIButton buttonWithType:UIButtonTypeContactAdd];
[add addTarget:self action:@selector(clickAdd) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *rightitem = [[UIBarButtonItem alloc]initWithCustomView:add];
self.navigationItem.rightBarButtonItem = rightitem; AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
_myAppdelegate = delegate ;
NSManagedObjectContext *context = _myAppdelegate.persistentContainer.viewContext; // 进入控制器时 查询数据库数据
/**
两种方式创建request
*/
// NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"];
NSFetchRequest *request = [Person fetchRequest];
/**
数据排序
*/
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
request.sortDescriptors = @[descriptor];
/**
刷选数据
*/
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age == 8"];
// request.predicate = predicate;
NSError *error = nil;
NSArray *result = [context executeFetchRequest:request error:&error];
for (Person * p in result) {
NSLog(@"-查询结果:-----name:%@-------age:%lld",p.name,p.age);
}
[self.dataSource addObjectsFromArray:result];
[self.tableView reloadData];
} /**
插入数据
*/
- (void)clickAdd
{
NSManagedObjectContext *context = _myAppdelegate.persistentContainer.viewContext;
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
person.name = @"jeck";
NSInteger temp = random() % + ;
person.age = temp;
[self.dataSource addObject:person];
[self.tableView reloadData];
[_myAppdelegate saveContext];
} -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.dataSource.count;
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
if (!cell) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];
}
Person *modle = self.dataSource[indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@----%lld",modle.name,modle.age];
return cell;
} - (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
} /**
删除数据
*/
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
Person *p = self.dataSource[indexPath.row];
[self.dataSource removeObject:p];
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
[_myAppdelegate.persistentContainer.viewContext deleteObject:p];
[_myAppdelegate saveContext];
}
} /**
点击修改数据
*/
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Person *p = self.dataSource[indexPath.row];
p.name = @"rose";
[_myAppdelegate saveContext];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
简单说一下数据库的升级,模型版本的迁移:(能够使老版本的数据库正常使用)
新生成的新数据库文件:
切换之后,文件上勾选的是test_coreDate2了,此时就可以向新的模型库里添加新增的模型属性了,
然后需要生成一个模型的映射文件:
command + N
之后就会生成一个 v1.0_Tov1.1Model.xcmappingmodel 文件,前面的名字自己随意;
然后,就把旧的数据库的四个模型文件(Person+CoreDataClass.h ...m Person+CoreDataProperties.h ....m)删除,重新使用新的数据库test_CoreData2 创建模型文件。
看网上说的还需要修改Appdelegate中的代码,发现现在不用修改了。(想修改也找不到地方了,现在自动生成的代码和之前的不一样了)
在网上很多都是旧的,只发现这个比较新点http://blog.csdn.net/willluckysmile/article/details/76464249
CoreData的学习的更多相关文章
- iOS CoreData技术学习资源汇总
一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...
- Core Data (一)备
序 恩,用Core Data也有一段时间了.大大小小的坑也都坑过了.重来没有认真的记录一次.这次需要好好的理一理Core Data.就当一次绝好的机会记录下来.也为了自己加深认识. 为什么要用Core ...
- masonry使用问题
2015年11月3日 coreData的学习练习中复习使用masonry自动布局 masonry自动布局发现问题: 两个控件的相对布局: 如果被参考对象用这个带anchor的属性,就会报这样一个错误: ...
- FireFox插件SQLite Manager的使用
最近几天开始高IOS数据库来着,一开始就CoreData的学习,结果高了一天没有一点进展. 没法,还是先老实代码着吧,不过用的火狐插件可视化数据库的操作也是不错的似乎. FireFox 插件:SQLi ...
- 【原】iOS学习之SQLite和CoreData数据库的比较
1. SQLite数据库 sqlite数据库操作的基本流程是, 创建数据库, 再通过定义一些字段来定义表格结构, 可以利用sql语句向表格中插入记录, 删除记录, 修改记录, 表格之间也可以建立联系. ...
- IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...
- 学习在创建好的工程里面添加CoreData
在学习CoreData中, 在建工程后, 没有添加, 于是就参考网络文章进行更改. 这几天在学习做一个ios的小项目,项目中需要对数据进行基本的增删改查操作.于是就想用一把CoreData.但在创建项 ...
- CoreData学习-最好的一片文章
CoreData学习-最好的一片文章 分类: IOS重新上路2014-05-25 18:00 1937人阅读 评论(0) 收藏 举报 目录(?)[+] 写的很好的一篇教程,我什么时候能写出这么 ...
- CoreData的使用(IOS学习)
——杂言:最近开始学习IOS7的开发,下文是在已经建好的项目里加入CoreData的结构,并实现一个基于coredata的简单save,query. 1. 引入Core Data Framework. ...
随机推荐
- HIVE 计算指定日期本周的第一天和最后一天
-- 计算指定日期本周的第一天和最后一天 select day ,dayofweek(day) as dw1 ,date_add( - dayofweek(day)) as Su_s -- 周日_st ...
- php数组·的方法3-数组和变量之间的转换
/* * 数组和变量之间的转换 * */ //extract() 使用数组定义一组变量 // 键名为变量名 键值为变量值(类似于js的解构赋值) // 返回值是数组的长度 echo '<hr&g ...
- nginx —— 理解nginx_upstream_jvm_route模块解决tomcat多节点session不一致问题
这种方式不需要修改web工程只需要对nginx下载nginx_upstream_jvm_route插件,修改tomcat和nginx配置,就能解决session问题.由于这种方式不会把session存 ...
- my.宠物价格_资料
1.梦幻西游手游宠物估价五大实用技巧_72G梦幻西游手游专区.html http://www.72g.com/game/mhxysy/88470.html 梦幻西游手游宠物估价五大实用技巧 作者:升仙 ...
- 数据库迁移expdp impdp 与 OGg 搭建
1.long 字段的无法使用OGG 同步 2.clob字段的导入导出Bug , 生产使用network-link 导入导出太慢了,本地导入导出速度会快3到4倍 .但是测试环境的情况却相反 测试环境和生 ...
- oracle merge into函数中插入clob字段
当使用Merge into 函数向ORACLE数据库中插入或更新数据时,报错“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”,使用如下方法可以把String转换为clob. 需 ...
- JavaSE---接口
1.概述 1.1 接口只能继承接口(不能继承类): 1.2 一个接口可以继承多个接口: 1.3 接口中不能包含构造器.初始化块,可以有 属性(只能是常量).方法(只能是抽象方法).内部类(内部接口). ...
- jenkins自动打IOS包(转发)
投稿文章,作者:一缕殇流化隐半边冰霜(@halfrost) 前言 众所周知,现在App的竞争已经到了用户体验为王,质量为上的白热化阶段.用户们都是很挑剔的.如果一个公司的推广团队好不容易砸了重金推广了 ...
- LeetCode 870.优势洗牌(C++)
给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述. 返回 A 的任意排列,使其相对于 B 的优势最大化. 示例 1: 输入: ...
- Entity Framework Many to Many Relation Mapping(Entity Framework多对多关系映射)
通常我们在做数据库设计时都会有两张表是多对多关系的时候,在数据库做多对多关系时候我们通常通过中间关联表来处理,那我们现在在EF中是如何处理的呢? 假设我们有如下关系,用户(User)包含多个角色(Ro ...