CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移
上一篇中我们已经使用CoreData创建了一个SQLite数据库
CoreData的简单使用(一)数据库的创建
现在对数据库进行数据的CRUD(增删改查)
1.Data Model 的设置
创建一个DataModel,取名CRUD.xcdatamodeld,添加Entity(Library和Book),添加属性,在Book中设置和Library的关联关系(一个Book可以存放在一个Library里)
Book的属性和关联关系(选择Destination为Library,关系名称取名为library)注意区分大小写
Library的属性:
创建NSManagerObject subclass:
2. 在viewController.m来进行CRUD,注意方法的调用下面代码都抽离成方法,对数据进行操作都要创建_context对象(调用creatSQLite方法)
(1)导入头文件
#import "Library.h"
#import "Book.h"
#import <CoreData/CoreData.h>
(2)设置context属性,因为我们是利用context进行CRUD,所以把它设置成一个属性或者全局变量
@interface ViewController () @property (strong, nonatomic) NSManagedObjectContext *context; @end
(3)创建数据库
- (void)creatSQLite
{
//1.创建NSManagedObjectModel对象
NSURL *dataModelURL = [[NSBundle mainBundle] URLForResource:@"CRUD" withExtension:@"momd"];
NSManagedObjectModel *dataModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:dataModelURL]; //2.创建NSPersistentStoreCoordinator对象
NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:dataModel];
//设置数据库保存路径
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/CRUD.sqlite"];
NSLog(@"%@",path); //注意这里不能用[NSURL URLWithString:<#(nonnull NSString *)#>];
NSURL *pathURL = [NSURL fileURLWithPath:path];
//配置库的类型为SQLite
[psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:pathURL options:nil error:nil]; //3.创建_context并与psc进行关联
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_context.persistentStoreCoordinator = psc;
}
去沙盒里找到数据库,查看一下,成功创建,关联关系也已经建立好了,Book里有一个LIBRARY的属性
3.添加数据
- (void)creatManagerObject
{
//NSManagerObject或它的子类都要用NSEntityDescription来描述
Library *libraryOne = [NSEntityDescription insertNewObjectForEntityForName:@"Library" inManagedObjectContext:_context];
libraryOne.libraryName = @"图书馆1";
Library *libraryTwo = [NSEntityDescription insertNewObjectForEntityForName:@"Library" inManagedObjectContext:_context];
libraryTwo.libraryName = @"图书馆2"; Book *bookOne = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:_context];
bookOne.bookName = @"时间简史";
bookOne.library = libraryOne;
Book *bookTwo = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:_context];
bookTwo.bookName = @"全球通史";
bookTwo.library = libraryTwo;
Book *bookThree = [NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:_context];
bookThree.bookName = @"鲁滨逊漂流记";
bookThree.library = libraryTwo; //利用_context同步数据至数据库
if ([_context save:nil])
{
NSLog(@"添加数据成功");
}; }
数据已经成功添加了 注意:ZBOOK中的ZLIBRARY对应的是ZLIBRARY的Z_PK,不要和代码中的1,2混淆,
4.查询数据
- (void)retrieveManagerObject
{
//查询数据需要用到NSFetchRequest
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
//用谓词进行查询找出书名中最后一个是史字的图书
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookName like '*史'"];
//fetchRequest与谓词关联
fetchRequest.predicate = predicate;
//查询
NSArray *resultArr = [_context executeFetchRequest:fetchRequest error:nil]; //对查询到的结果进行遍历,打印书名
if (resultArr)
{
for (Book *book in resultArr)
{
NSLog(@"bookName = %@",book.bookName);
}
} }
查询结果如下 注意:这里容易造成错误的就是谓词的使用,如果没有对应得属性就会造成崩溃;
5.修改数据
- (void)updateManagerObject
{
//更新数据前需要先查询到数据
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookName = '鲁滨逊漂流记'"];
fetchRequest.predicate = predicate;
NSArray *resultArr = [_context executeFetchRequest:fetchRequest error:nil]; if (!resultArr)
{
return;
}
//把查询到的书名全都替换成“生物医学工程”
Book *book = [resultArr firstObject];
book.bookName = @"生物医学工程";
//同步数据到数据库
if([_context save:nil])
{
NSLog(@"数据修改成功");
}
else
{
NSLog(@"数据修改失败");
} }
结果,已经把“鲁滨逊漂流记”的书名修改成了“生物医学工程”
6.删除数据
- (void)deleteManagerObject
{
//删除数据前先要查询到需要删除的数据
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bookName = '生物医学工程'"];
fetchRequest.predicate = predicate;
NSArray *resultArr = [_context executeFetchRequest:fetchRequest error:nil]; if (!resultArr)
{
return;
} Book *book = [resultArr firstObject];
//删除数据
[_context deleteObject:book];
//同步至数据库
if([_context save:nil])
{
NSLog(@"删除数据成功");
}
else
{
NSLog(@"删除数据失败");
} }
结果,“生物医学工程”这本书已经被成功删除
7.版本迁移
模型文件的版本迁移:
1.原则:不能删除原来的模型文件,而是新增模文件的版本。
2.步骤:
(1)创建模型文件的新版本:Editor/Add Model Version
(2)设置Current Model Version为新版本。
(3)在配置NSPersistentStoreCoordinator时,添加设置字典,里面有相关键值对配置设置选项。
3.实现
(1)选中工程中的 xcdaramodeId 文件,Menu->Editor->Add Model Version
(2) 添加完成后,xcdaramodeId 文件可以展开,可以看到新增加的Model文件 ,在右侧工具栏选择Current Model Version 为新的Model文件
(3)在CRUD 2Z中添加新的实体和属性
(4)在ViewController.m - (void)creatSQLite方法中修代码,主要是NSPersistentStoreCoordinator的配置字典
之前 addPersistentStoreWithType: configuration: URL: options: error: 方法中options传的都是nil
修改后传入配置字典
NSDictionary *optionsDic = @{
//自动版本迁移
NSMigratePersistentStoresAutomaticallyOption : @YES,
//自动映射
NSInferMappingModelAutomaticallyOption : @YES }; [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:pathURL options:optionsDic error:nil];
(5)运行,找到数据库进行查看Person已经被添加进来了,数据也都正确
上述代码只能是对数据模型增加实体或者可选属性时,才可以这样迁移(轻量级迁移 Lightweight Migration)
CoreData的简单使用(二)数据的增删改查,轻量级的版本迁移的更多相关文章
- CoreData 从入门到精通(二) 数据的增删改查
在上篇博客中,讲了数据模型和 CoreData 栈的创建,那下一步就是对数据的操作了.和数据库一样,CoreData 里的操作也无非是增删改查.下面我们将逐步讲解在 CoreData 中进行增删改查的 ...
- SQLAlchemy(二):SQLAlchemy对数据的增删改查操作、属性常用数据类型详解
SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 目录 SQLAlchemy02 /SQLAlchemy对数据的增删改查操作.属性常用数据类型详解 1.用se ...
- Mybatis学习总结(二)—使用接口实现数据的增删改查
在这一篇中,让我们使用接口来实现一个用户数据的增删改查. 完成后的项目结构如下图所示: 在这里,person代表了一个用户的实体类.在该类中,描述了相关的信息,包括id.name.age.id_num ...
- Hibernate3回顾-5-简单介绍Hibernate session对数据的增删改查
5. Hibernate对数据的增删改查 5.1Hibernate加载数据 两种:get().load() 一. Session.get(Class arg0, Serializable arg1)方 ...
- Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm连接数据库、django使用mysql数据库、表字段的增删改查、表数据的增删改查
本节知识点大致为:静态文件配置.form表单提交数据后端如何获取.request方法.pycharm连接数据库,django使用mysql数据库.表字段的增删改查.表数据的增删改查 一.创建app,创 ...
- 最简单的jsp+servlet的增删改查代码
package ceet.ac.cn.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
- vue实现对表格数据的增删改查
在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...
- Node.js + MySQL 实现数据的增删改查
通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...
- SQL Server -- 回忆笔记(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询
SQL Server知识点回忆篇(二):增删改查,修改表结构,约束,关键字使用,函数,多表联合查询 1. insert 如果sql server设置的排序规则不是简体中文,必须在简体中文字符串前加N, ...
- mysql学习笔记一 —— 数据的增删改查
1.连接mysql mysql 直接回车(是以root身份,密码空,登陆的是本机localhost) [root@www mysql]# mysql -uroot -p123 -S /var/lib/ ...
随机推荐
- 一点关于this的理解
关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...
- HDFS之SequenceFile和MapFile
http://blog.csdn.net/javaman_chen/article/details/7241087 Hadoop的HDFS和MapReduce子框架主要是针对大数据文件来设计的,在小文 ...
- js中的null与undefined
null undefined
- 开源Pull_To_Refresh控件使用
学习知识点 onTouch事件传递机制. Lisenter监听 ImageView的src background scaleType不同属性的显示情况. onTouch滑动抬起调用的MotionEve ...
- iOS NSMutableArray替换某个元素
A * a1 = [A new]; A * a2 = [A new]; A * a3 = [A new]; A * a4 = [A new]; NSMutableArray *arr = [[NSMu ...
- 代码静态分析工具PCLint, Splint
一.PCLint REFER: 代码静态检查工具PC-Lint运用实践 二.Splint 1.在PC-Linux上安装 ①make error undefined reference toyywrap ...
- JS实现div块的拖放,调换位置
主要是HTML5 的拖放(Drag 和 Drop) 例子(不需要对div设置ID): <!DOCTYPE HTML> <html> <head> <scrip ...
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- TreeMap 红黑树实现
TreeMap 是一个有序的key-value集合,它是通过 红黑树 实现的. TreeMap 继承于AbstractMap,所以它是一个Map,即一个key-value集合. TreeMap 实现了 ...
- 前端资源多个产品整站一键打包&包版本管理(三)—— gulp分流
问题: 当我们一个工作台里面有好几个项目的时候,我们要为项目的前端资源进行打包,但是,gulpfile只有一个,如果我们把所有的打包都放在同一个文件里面,首先文件会越来越大,而且不便于管理,这时,我们 ...