1>什么是CoreData

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句,这个有点类似于著名的Hibernate持久化框架,不过功能肯定是没有Hibernate强大的。
 
 
 
2>CoreData的使用步骤
 
1.创建模型文件
2.添加实体
3.创建实体类
4.生成上下文 关联模型文件生成数据库
5.保存对象到数据库
6.从数据库获取对象
7.更新数据
8.删除数据
 
3>打开CoreData的SQL语句输出开关
 
1.打开Product,点击EditScheme...
2.点击Arguments,在ArgumentsPassed On Launch中添加2项
   1> -com.apple.CoreData.SQLDebug
   2> 1
 

一、CoreData基本使用-增删改查和表关联

 //
// ViewController.m
// IOS_0121_CoreData
//
// Created by ma c on 16/1/21.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Employee.h"
#import "Department.h" @interface ViewController () @property (nonatomic, strong) NSManagedObjectContext *context; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//1.创建模型文件(相当于数据库中的表)
//2.添加实体(一张表)
//3.创建实体类(相当于模型)
//4.生成上下文,关联模型文件生成数据库 //上下文
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
//模型数据文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; //持久化存储器
//把数据保存到一个文件,而不是内存
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//数据名字和路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlitePath = [path stringByAppendingPathComponent:@"company.sqlite"];
NSLog(@"%@",sqlitePath); NSURL *url = [NSURL fileURLWithPath:sqlitePath];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil]; self.context.persistentStoreCoordinator = store; }
//数据库操作ADUQ (ADD、Delete、Update、Query)
#pragma mark - 添加员工
- (IBAction)addEmployee
{
Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context]; emp.name = @"bowen";
emp.height = @"";
emp.birthday = [NSDate date]; //直接保存
NSError *error = nil;
[self.context save:&error]; if (error) {
NSLog(@"%@",error);
}
} #pragma mark - 查询员工
- (IBAction)searchEmployee
{
//1.NSFetchRequest 抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
//2.设置过滤条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"bowen"];
request.predicate = pre;
//3.排序
NSSortDescriptor *heightSort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];
request.sortDescriptors = @[heightSort];
//4.执行请求
NSError *error = nil;
NSArray *emps = [self.context executeFetchRequest:request error:&error]; if (error) {
NSLog(@"%@",error);
} for (Employee *emp in emps) {
NSLog(@"name:%@ height:%@ birthday:%@",emp.name, emp.height, emp.birthday);
}
} #pragma mark - 更新员工
- (IBAction)updateEmployee
{
//1.查找
//获取对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
//设置过滤条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"bowen"];
request.predicate = pre;
//执行请求
NSArray *emps = [self.context executeFetchRequest:request error:nil]; //2.更新
for (Employee *emp in emps) {
emp.height = @"";
}
//3.保存
[self.context save:nil];
} #pragma mark - 删除员工
- (IBAction)deleteEmployee
{
//1.查找
//获取对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
//设置过滤条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name = %@",@"bowen"];
request.predicate = pre;
//执行请求
NSArray *emps = [self.context executeFetchRequest:request error:nil]; //2.删除
for (Employee *emp in emps) {
[self.context deleteObject:emp];
} //3.保存
[self.context save:nil];
} #pragma mark - 表关联
- (IBAction)AddRelationship
{
//创建两个部门:IOS、Android
Department *IOSDepart = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.context];
IOSDepart.departNo = @"";
IOSDepart.name = @"IOS";
IOSDepart.createDate = [NSDate date]; Department *AndroidDepart = [NSEntityDescription insertNewObjectForEntityForName:@"Department" inManagedObjectContext:self.context];
AndroidDepart.departNo = @"";
AndroidDepart.name = @"Android";
AndroidDepart.createDate = [NSDate date]; //创建两个员工:bowen1,bowen2
Employee *emp1 = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];
emp1.name = @"bowen1";
emp1.height = @"";
emp1.birthday = [NSDate date];
emp1.depart = IOSDepart; Employee *emp2 = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];
emp2.name = @"bowen2";
emp2.height = @"";
emp2.birthday = [NSDate date];
emp2.depart = AndroidDepart; //保存
[self.context save:nil];
} - (IBAction)searchRelationship
{
//读取IOS部门员工 //1.NSFetchRequest 抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
//2.设置过滤条件
NSPredicate *pre = [NSPredicate predicateWithFormat:@"depart.name = %@",@"IOS"];
request.predicate = pre;
//3.执行请求
NSError *error = nil;
NSArray *emps = [self.context executeFetchRequest:request error:&error]; if (error) {
NSLog(@"%@",error);
} for (Employee *emp in emps) {
NSLog(@"name:%@ height:%@ birthday:%@",emp.name, emp.height, emp.birthday);
} } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

三、分页查询和模糊查询

 //
// ViewController.m
// IOS_0121_CoreData
//
// Created by ma c on 16/1/21.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Employee.h"
#import "Department.h" @interface ViewController () @property (nonatomic, strong) NSManagedObjectContext *context; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
//1.创建模型文件(相当于数据库中的表)
//2.添加实体(一张表)
//3.创建实体类(相当于模型)
//4.生成上下文,关联模型文件生成数据库 //上下文
self.context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
//模型数据文件
NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; //持久化存储器
//把数据保存到一个文件,而不是内存
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//数据名字和路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlitePath = [path stringByAppendingPathComponent:@"company.sqlite"];
NSLog(@"%@",sqlitePath); NSURL *url = [NSURL fileURLWithPath:sqlitePath];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil]; self.context.persistentStoreCoordinator = store; }
//数据库操作ADUQ (ADD、Delete、Update、Query)
#pragma mark - 添加员工
- (IBAction)addEmployee
{ for (int i = ; i < ; i++) {
Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.context];
emp.name = [NSString stringWithFormat:@"bowen%d",i];
emp.height = [NSString stringWithFormat:@"%d",+i];
emp.birthday = [NSDate date]; } //直接保存
NSError *error = nil;
[self.context save:&error]; if (error) {
NSLog(@"%@",error);
}
} #pragma mark - 分页查询
- (IBAction)pagingAndQuerying
{
//1.NSFetchRequest 抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; //2.排序
NSSortDescriptor *heightSort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];
request.sortDescriptors = @[heightSort]; //3.分页查询
//分页的起始索引
request.fetchOffset = ;
//分页的条数
request.fetchLimit = ; //4.执行请求
NSError *error = nil;
NSArray *emps = [self.context executeFetchRequest:request error:&error]; if (error) {
NSLog(@"%@",error);
} for (Employee *emp in emps) {
NSLog(@"name:%@ height:%@ birthday:%@",emp.name, emp.height, emp.birthday);
}
} - (IBAction)fuzzyQuery
{
//1.NSFetchRequest 抓取请求对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Employee"]; //2.排序
NSSortDescriptor *heightSort = [NSSortDescriptor sortDescriptorWithKey:@"height" ascending:YES];
request.sortDescriptors = @[heightSort]; //3.模糊查询
//名字以“bowen1”开头
//NSPredicate *pre = [NSPredicate predicateWithFormat:@"name BEGINSWITH %@",@"bowen1"];
//request.predicate = pre; //名字以“1”结尾
//NSPredicate *pre = [NSPredicate predicateWithFormat:@"name ENDSWITH %@",@"1"];
//request.predicate = pre; //名字包含“wen1”结尾
//NSPredicate *pre = [NSPredicate predicateWithFormat:@"name CONTAINS %@",@"1"];
//request.predicate = pre; //like
//名字以“1”结尾
//NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like %@",@"*wen14"];
//request.predicate = pre; //名字以“bowen2”开头
NSPredicate *pre = [NSPredicate predicateWithFormat:@"name like %@",@"bowen2*"];
request.predicate = pre; //4.执行请求
NSError *error = nil;
NSArray *emps = [self.context executeFetchRequest:request error:&error]; if (error) {
NSLog(@"%@",error);
} for (Employee *emp in emps) {
NSLog(@"name:%@ height:%@ birthday:%@",emp.name, emp.height, emp.birthday);
}
} @end

三、创建多个数据库

 //
// ViewController.m
// IOS_0121_CoreData
//
// Created by ma c on 16/1/21.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import <CoreData/CoreData.h>
#import "Employee.h"
#import "Status.h" @interface ViewController () @property (nonatomic, strong) NSManagedObjectContext *companyContext;
@property (nonatomic, strong) NSManagedObjectContext *weibocontext; @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; //一个数据库对应着一个上下文
self.companyContext = [self setupContextWithModelName:@"Company"];
self.weibocontext = [self setupContextWithModelName:@"weibo"]; } //根据模型文件返回上下文
- (NSManagedObjectContext *)setupContextWithModelName:(NSString *)modelName
{
//1.创建模型文件(相当于数据库中的表)
//2.添加实体(一张表)
//3.创建实体类(相当于模型)
//4.生成上下文,关联模型文件生成数据库 //上下文
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; //模型数据文件
//使用下面的方法,如果boundles为空,会把boundles里面所有的模型文件的表都放在一个数据库中
//NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil]; NSLog(@"%@",[[NSBundle mainBundle] bundlePath]); NSURL *modelURL = [[NSBundle mainBundle] URLForResource:modelName withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; //持久化存储器
//把数据保存到一个文件,而不是内存
NSPersistentStoreCoordinator *store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model]; //数据名字和路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *sqlliteName = [NSString stringWithFormat:@"%@.sqllite",modelName]; NSString *sqlitePath = [path stringByAppendingPathComponent:sqlliteName];
NSLog(@"%@",sqlitePath); NSURL *url = [NSURL fileURLWithPath:sqlitePath];
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil]; context.persistentStoreCoordinator = store; return context; }
//数据库操作ADUQ (ADD、Delete、Update、Query)
#pragma mark - 添加
- (IBAction)add
{
Employee *emp = [NSEntityDescription insertNewObjectForEntityForName:@"Employee" inManagedObjectContext:self.companyContext];
emp.name = @"bowen";
emp.height = @"";
emp.birthday = [NSDate date]; Status *status = [NSEntityDescription insertNewObjectForEntityForName:@"Status" inManagedObjectContext:self.weibocontext];
status.text = @"回家";
status.createDate = @"2015-01-28"; [self.companyContext save:nil];
[self.weibocontext save:nil]; } #pragma mark - 查询
- (IBAction)querying
{ } @end

IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)的更多相关文章

  1. iOS CoreData 增删改查详解

    最近在学习CoreData, 因为项目开发中需要,特意学习和整理了一下,整理出来方便以后使用和同行借鉴.目前开发使用的Swift语言开发的项目.所以整理出来的是Swift版本,OC我就放弃了. 虽然S ...

  2. IOS - CoreData 增删改查

    #pragma mark - Core Data Methods - (void)insertObjectWithFileName:(NSString *)fileName { /** SQL新增记录 ...

  3. Elasticsearch增删改查 之 —— mget多文档查询

    之前说过了针对单一文档的增删改查,基本也算是达到了一个基本数据库的功能.本篇主要描述的是多文档的查询,通过这个查询语法,可以根据多个文档的查询条件,返回多个文档集合. 更多内容可以参考我整理的ELK文 ...

  4. Java简单示例-用户登录、单个页面的增删改查及简单分页

    index.html  -登录->stulist.jsp (index.html传递到LoginServlet,进行登录检测及写入session,NO返回index.html界面,OK 跳转到s ...

  5. day38 mycql 初识概念,库(增删改查),表(增删改)以及表字段(增删改查),插入更新操作

    在Navicat中把已经生成的表逆向成模型 数据库上,右键-逆向数据库到模型 ego笔记: 增删改查 文件夹(库) 增 create database day43 charset utf8; 改 al ...

  6. SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)

    软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...

  7. bootstrap-table 分页增删改查之一(分页)

    记录一下 bootstrap-table插件的使用 先看下效果图 首先是导入js <!--js jquery --> <script type="text/javascri ...

  8. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  9. Oracle使用JDBC进行增删改查 表是否存在

    Oracle使用JDBC进行增删改查 数据库和表 table USERS (   USERNAME VARCHAR2(20) not null,   PASSWORD VARCHAR2(20) ) a ...

  10. MongoDB增删改查表文档

    MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写,是一个基于分布式文件存储的开源数据库系统.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关 ...

随机推荐

  1. linux下的进程,子进程,线程

    1.相同点:(a)二者都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略.(b) 每个进程都有一个进程控制块,线程也拥有一个线程控制块.(c) 线程和子进程共享父进程中的资源:线程和子进程独立 ...

  2. Linux入门之常用命令(15) lsof

    查看磁盘空间: [root@ticketb ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda1 981M 203M 729M ...

  3. SHFileOperation的用法

    //删除文件或者文件夹bool DeleteFile(char * lpszPath){SHFILEOPSTRUCT FileOp={0};FileOp.fFlags = FOF_ALLOWUNDO ...

  4. thinkphp处理jQuery EasyUI form表单问题

    jQuery EasyUI form表单不是ajax方式提交,而是在提交的时候新建一个隐藏的iframe并在iframe里面创建一个与绑定表单一样的表单,然后在iframe里面进行同步提交而不是异步提 ...

  5. C#字母转换成数字/数字转换成字母 - ASCII码转换

    字母转换成数字 byte[] array = new byte[1];   //定义一组数组arrayarray = System.Text.Encoding.ASCII.GetBytes(strin ...

  6. Jedis连接池

    jedis是官方首选的java客户端开发包 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Ja ...

  7. pyDay17

    1.用filter求素数. 埃拉托色尼筛选法. #!/usr/bin/env python3 # -*- coding: utf-8 -*- def _odd_iter(): n = 1 while ...

  8. MySQL备份与恢复-mysqldump备份与恢复

    这片博文主要用来介绍MySQL的备份与恢复: MySQL的备份形式可以分为如下几种: 热备----即不停机备份 冷备----需要关闭MySQL,然后备份其数据文件.(停机备份一般是直接拷贝其datad ...

  9. 关于Redis命令keys在性能方面的说明

    redis的keys命令类似于Mysql的like命令,无非就是模糊匹配相近的字符数据. KEYS 的速度非常快,但在一个大的数据库中使用它仍然可能造成性能问题,如果你需要从一个数据集中查找特定的 k ...

  10. 面试官问:JS的this指向

    前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...