在实际开发中,往往需要每个模块使用不同数据库,而CoreData也具备这样的功能,使用起来也很方便:

首先我们创建2个模型文件(School和Educationist)

// 1.创建模型文件 (相当于一个数据库里的表)

// New File ———— CoreData ———— Data Model ———— Next

// 2.添加实体 (相当于一张表)

// 找到我们创建的模型文件(xxx.xcdatamodeld,我创建的叫School.xcdatamodeld)————Add
Entity ———— 添加表内属性(这边我添加2个属性(name,age))


// 3.创建实体类

// New File ———— CorData ———— NSManagedobject subclass ————Next(记得选择需要关联的表)这样就会自动生成相应的模型

// Educationist创建方式和School一样

创建好模型文件后,我们怎样才能让每个模型文件独立呢?我们可以从上下文入手,因为每个上下文对应一个数据库。

//我们先将上下文的创建方式独立出来,以便以后使用

- (NSManagedObjectContext*)setupContextWithModelName:(NSString*)modelName

{

// 生成上下文关联模型文件生成数据库(关联的时候,如果本地没有数据库文件,CoreData会自己创建)

//
上下文,记得引用CoreData框架

NSManagedObjectContext
*context= [[NSManagedObjectContext alloc]init];

// 上下文关联数据库

NSURL*sqlURL= [[NSBundlemainBundle]URLForResource:modelNamewithExtension:@"momd"];

NSManagedObjectModel
*model= [[NSManagedObjectModel alloc]initWithContentsOfURL:sqlURL];

//持久化存储调度器(持久化:把数据保存在一个文件,而不是放在内存中)

NSPersistentStoreCoordinator
*store= [[NSPersistentStoreCoordinator
alloc]initWithManagedObjectModel:model];

//
告诉CoreData数据库的名字和路径

NSString*doc= [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)lastObject];

NSString*sqliteStr = [NSStringstringWithFormat:@"%@.sqlite",modelName];

NSString*sqlitePath = [doc
stringByAppendingPathComponent:sqliteStr];

[storeaddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:[NSURLfileURLWithPath:sqlitePath]options:nilerror:nil];

context.persistentStoreCoordinator=store;

returncontext;

}

// 然后在需要用到上下文的地方调用此方法就可以了

_schoolContext=[selfsetupContextWithModelName:@"School"];

_educationistContext= [self
setupContextWithModelName:@"Educationist"];

这样数据库就独立出来了,测试一下:

#pragma mark - 添加

- (void)addStudent

{

// 创建一个学生对象

//   Student *stu = [[Student alloc] init];

Student*stu=[NSEntityDescriptioninsertNewObjectForEntityForName:@"Student"inManagedObjectContext:_schoolContext];

stu.name=
@"李四";

stu.age=
@1.9;

//
直接保存数据库

[_schoolContext
save:nil];

// 创建一间学校对象

School*sch= [NSEntityDescriptioninsertNewObjectForEntityForName:@"School"inManagedObjectContext:_educationistContext];

sch.name=
@"张三中学";

sch.no=
@1.0;

//
直接保存数据库

[_educationistContext
save:nil];

}

#pragma mark - 读取

- (void)readStudent

{

// FectchRequest
抓取请求对象

NSFetchRequest
*request= [NSFetchRequest fetchRequestWithEntityName:@"Student"];

//
执行请求

NSArray*stus = [_schoolContextexecuteFetchRequest:requesterror:nil];

for(Student*stu
instus)

{

NSLog(@"名字:%@身高:%@",stu.name,stu.age);

}

// FectchRequest
抓取请求对象

NSFetchRequest
*request2= [NSFetchRequest fetchRequestWithEntityName:@"School"];

//
执行请求

NSArray*schs = [_educationistContextexecuteFetchRequest:request2error:nil];

for(School*sch
inschs) {

NSLog(@"学校名称:%@编号:%@",sch.name,sch.no);

}

}

2015-10-30 12:20:20.632 CoreData多个数据库使用[1727:66199]名字:李四
身高:1.9

2015-10-30 12:20:20.632 CoreData多个数据库使用[1727:66199]学校名称:张三中学
编号:1


就是这么简单,到这里CoreData简单的使用就结束了!


CoreData的底层就是帮我们把sql语句进行封装,使我们可以避免使用sql语句,更好地进行开发,但肯定是在牺牲运行效率的情况下。

如果需要查看CoreData运行过程中帮我们写了哪些sql语句,可以使用这个方法:

1.打开Product ———— EditScheme… ————Arguments ———— 在ArgumentsPassed OnLaunch中添加两项(顺序不可变)

1>-com.apple.CoreData.SQLDebug

2> 1

这样再次运行APP就会在控制台输出CoreData运行过程中使用的sql语句。



【CoreData】多个数据库使用的更多相关文章

  1. iOS CoreData版本升级和数据库迁移

    app中使用了CoreData,并且在下一个版本中有实体变动,比如实体新增字段.修改字段等改动, 那么app在覆盖安装时就要进行数据库迁移, 否则app就会crash. 那如何实现数据库迁移呢?大概需 ...

  2. 优于CoreData的Realm数据库基础教程

    Realm 是一个跨平台的移动数据库引擎,于 2014 年 7 月发布,准确来说,它是专门为移动应用所设计的数据持久化解决方案之一. Realm 可以轻松地移植到您的项目当中,并且绝大部分常用的功能( ...

  3. iOS - CoreData 数据库存储

    1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...

  4. CoreData 数据库

    封装CoreManager类 @implementation CoreDataManager { //上下文 NSManagedObjectContext *_ctx; } //单例 +(instan ...

  5. IOS数据存储之FMDB数据库

    前言: 最近几天一直在折腾数据库存储,之前文章(http://www.cnblogs.com/whoislcj/p/5485959.html)介绍了Sqlite 数据库,SQLite是一种小型的轻量级 ...

  6. IOS中CoreData浅析

    CoreData简介: 什么是CoreData? Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中, ...

  7. CoreData基础

    CoreData用于做数据持久化,适合大数据量的存储和查询 CoreData不是数据库 CoreData可以使用数据库 ,XML等方式来存储数据 CoreData使用面向对象的方式操作数据 CoreD ...

  8. 高级UIKit-05(CoreData)

    [day06_1_CoreDataPerson]:保存person对象到coreData数据库 保存大量数据时用CoreData保存到数据库,数据库会存在documents目录下 操作步骤: 1.创建 ...

  9. CoreData归纳使用

    1.CoreData简介 2.CoreData数据模型 3.CoreData的主要对象 4.使用CoreData实现数据存储 一.CoreData简介 CoreData用做数据持久化,是数据持久化的最 ...

随机推荐

  1. Mybatis学习错误之:重复加载mapper.xml

    学习mybatis的时候,突然遇到测试出错.测试mapper代理失败,现在钻研少了,不喜欢看未知的错误了,立即改正.错误打印说mapper.xml已经注册,仔细查看SQLMapConfig.xml发现 ...

  2. 使用Microsoft Fakes进行单元测试(2)

    接上一篇使用Microsoft Fakes进行单元测试(1) 下面进行Shim的演示. 2.使用Shim替换静态方法 假设我们需要一个工具方法用来格式化当前时间为字符串,因为DateTime.Now一 ...

  3. 安装部署Windows服务脚本

    @echo off Installutil.exe 程序目录 F:\test\TestWindows.exe 服务程序目录 @sc start "服务名称" @sc config ...

  4. C语言学习021:管道

    将第一个程序的输出流作为第二个程序的输入流 ls /etc/ ---------显示etc下的所有文件及目录 grep rc -----------输出包含rac的内容 | -------连接管道 一 ...

  5. 自己对Debug的一些感悟

    A.13-03-06记. 1.当项目中发现bug的时候,首先考虑如何重现,能够重现的bug比较好找寻根源. 2.思考下以前是否发现过类似bug,是否由一些外部配置所决定. 3.有循环时候注意临界条件.

  6. 【处理手记】Configuration system failed to initialize异常的另类原因

    有个c#程序在某台电脑上,执行某个操作时,总是会报如图错误: 度娘一番,发现市面上常见的原因是配置文件中的特定节点的位置不对,或者配置文件损坏等等,而这个程序根本没有使用内置的配置文件方案,而是用的i ...

  7. oracle11g的standby性能分析报告statpack安装

    一般常见的分析standby database的性能问题的方法就是通过动态性能视图来判断,从11g开始,随着Active Data Guard功能的出现,早期的Statspack 工具可以在stand ...

  8. Angular 2 要来了,Wijmo 已准备好迎接

    Angular 是一款优秀的前端JS框架,已被用于Google的多款产品中,其核心特点是:MVVM.模块化.自动化双向数据绑定.语义化标签.依赖注入等.6年过去了,Angular 迎来了2.0版本. ...

  9. Eclipse上GIT插件EGIT使用手册

    http://blog.csdn.net/luckarecs/article/details/7427605 Eclipse上GIT插件EGIT使用手册   一_安装EGIT插件 http://dow ...

  10. Android中自定义ProgressBar

    <ProgressBar             android:id="@+id/more_vprogress_more"             android:layo ...