iOS:CoreData数据库的使用二(创建多个数据库表,表之间有对应关系)
CoreData数据库框架是一个封装性好,功能强大数据库,它底层使用的还是sqlite数据库,不过苹果公司在其基础上,为其封装新和安全性的维护上做了大量的处理,例如对一些事物做了详细的操作,如读脏数据、提交回滚等,使得CoreData的安全性很可靠。
用数据库存储数据时,有时候不只是创建一个表,在创建多个表格并且两者之间有对应关系时,使用CoreData数据库框架能够很轻松的解决这些问题,效率极高。光说还是不能当真,下面我就来使用这个数据库存储两个有各自的属性数据并且有对应关系的表吧。
要求:创建两个表,一个是图书馆表,它的属性有:用户custommer、开放时间date;另一个是读者,它的属性有:姓名name、学号sno、年龄age、性别gender;
图书馆对应读者的关系时:一对多(一个图书馆里可以同时有多个用户)
读者对应图书馆是:一对一 (一个用户只能同时在一个图书馆中读书,没有分身术哟)
详细的实现步骤:
1、创建项目时,勾选Use CoreData选项;
2、创建项目成功后,所生成的文件中有CoreData___.xcdatamodel文件,点击它进入项目设置面板中;
3、在该面板中的左下方选择Add Entity选项,创建连个实体对象,并将其类名分别写成Library和Reader;
4、为类Library添加属性Attributes为:用户custommer string类型、开放时间date Date类型
5、为类Reader添加属性Attributes为:姓名name string类型、学号sno string类型、年龄age integer32类型、性别gender integer16类型;
6、为这两个实体创建对应关系,在relationship下点击'+'号,设置联系标识即可;
读者对应图书馆:一对一的关系
图书馆对应读者:一对多的关系
7、分别为这两个实体创建对应的类,它们都要继承于NSManagedObject,方法是:随意选中一个实体,然后点击模拟器菜单栏中的Editor下的Create NSManagedObject subclass...,编译器就帮助建立了这两个实体类Library.h/.m、Reader.h/.m,并且帮助声明和定义了所有的属性;
8、点击面板中的右下角的style按钮,可以查看两个表之间的联系和所有数据;
9、前期的操作已经全部完成,最后就是代码实现对数据库的操作功能了。
9.1在AppDelegate.m文件的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中设置表中的数据信息并将数据保存到存储持久层:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSUserDefaults *defaluts = [NSUserDefaults standardUserDefaults];
self.isInserted = [defaluts boolForKey:@"isInserted"]; //防止重复插入
if(!self.isInserted)
{ //取出图书馆实体对象
Library *library = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Library class]) inManagedObjectContext:self.managedObjectContext]; //设置对象属性
library.custommer = @"HIST";
library.date = [NSDate date]; for(int i=; i<; i++)
{
//取出读者实体对象
Reader *reader = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([Reader class]) inManagedObjectContext:self.managedObjectContext]; //设置对象属性
reader.name = [NSString stringWithFormat:@"name-%02d",i+];
reader.sno = [NSString stringWithFormat:@"1000%d",i];
reader.age = @( + i);
reader.gender = @'M'; //添加对应关系(图书馆对应多个读者)
[library addReadRelateObject:reader];
} //保存数据到持久层
[self saveContext]; //设置偏好设置,并强制写入文件中
[defaluts setBool:YES forKey:@"isInserted"];
[defaluts synchronize];
} return YES;
}
9.2 在视图控制器类ViewController.m文件中的- (void)viewDidLoad方法中可以对数据库中的数据执行增删改查的操作:
- (void)viewDidLoad {
[super viewDidLoad]; //创建应用程序对象
AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate]; //从CoreData中取出数据 //为查询图书馆信息创建请求对象
NSFetchRequest *fetchLibraryRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Library class])]; //为查询读者信息创建请求对象
NSFetchRequest *fetchReadRequest = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Reader class])]; //设置查询条件(可选的,类似于sql语句中的where语句)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"sno >= %d",];
[fetchReadRequest setPredicate:predicate]; //执行查询操作(返回的是一个数据数组)
NSError *error; NSArray *librarys = [appDelegate.managedObjectContext executeFetchRequest:fetchLibraryRequest error:&error]; NSArray *readers = [appDelegate.managedObjectContext executeFetchRequest:fetchReadRequest error:&error]; //遍历图书馆信息
[librarys enumerateObjectsUsingBlock:^(Library *library, NSUInteger idx, BOOL *stop) {
NSLog(@"custommer:%@,date:%@",library.custommer,library.date); //遍历读者信息
[readers enumerateObjectsUsingBlock:^(Reader *reader, NSUInteger idx, BOOL *stop) {
NSLog(@"name:%@,sno:%@,age:%@,gender:%c",reader.name,reader.sno,reader.age,(char)[reader.gender integerValue]); //修改读者信息
if([reader.name isEqualToString:@"name-02"])
{
reader.sno = @"";
}
//保存数据修改
NSError *error;
[appDelegate.managedObjectContext save:&error];
if(error)
{
NSLog(@"修改失败");
}
}];
}];
}
演示结果如下:
这个是没有修改之前查询的:
-- ::42.720 CoreData数据库2[:] custommer:HIST,date:-- :: +
-- ::42.721 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::42.722 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::42.722 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::42.722 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::42.722 CoreData数据库2[:] name:name-,sno:,age:,gender:M
这个是修改数据之后查询的:
-- ::58.952 CoreData数据库2[:] custommer:HIST,date:-- :: +
-- ::58.953 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::58.954 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::58.955 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::58.955 CoreData数据库2[:] name:name-,sno:,age:,gender:M
-- ::58.955 CoreData数据库2[:] name:name-,sno:,age:,gender:M
iOS:CoreData数据库的使用二(创建多个数据库表,表之间有对应关系)的更多相关文章
- sql server 2008 创建新数据库报错、创建表报错、更改表的设计报错
一:创建数据库报错如下: 二:解决,将软件以管理员身份运行 三:创建表报错如下图: 四:解决办法,在你创建的数据库下面的安全里,找到你创建的用户,属性,添加权限,红色标注,然后确定: 五:更改表的设计 ...
- [MYSQL][1]创建,修改,删除表
查看有哪些数据库: SHOW DATABASES; 创建,删除数据库: CREATE DATAABASE mydb; DROP DATABASE mydb; 查看有哪些表: SHOW TABLES; ...
- iOS CoreData (二) 版本升级和数据库迁移
前言:最近ChinaDaily项目需要迭代一个新版本,在这个版本中CoreData数据库模型上有新增表.实体字段的增加,那么在用户覆盖安装程序时就必须要进行CoreData数据库的版本升级和旧数据迁移 ...
- iOS:CoreData数据库的使用一(创建单个数据库表)
CoreData数据库框架:mac系统自带的数据库,它是苹果公司对sqlite进行封装而来的,既提供了对数据库的主要操作,也提供了具体的视图关系模型. 需要用到三个对象: 1•Managed Obje ...
- iOS - CoreData 数据库存储
1.CoreData 数据库 CoreData 是 iOS SDK 里的一个很强大的框架,允许程序员以面向对象的方式储存和管理数据.使用 CoreData 框架,程序员可以很轻松有效地通过面向对象的接 ...
- Android数据库高手秘籍(二):创建表和LitePal的基本用法
原文:http://blog.jobbole.com/77157/ 上一篇文章中我们学习了一些Android数据库相关的基础知识,和几个颇为有用的SQLite命令,都是直接在命令行操作的.但是我们都知 ...
- iOS CoreData (一) 增删改查
代码地址如下:http://www.demodashi.com/demo/11041.html Core Data是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映 ...
- IOS CoreData的(增删查改)
(1).CoreDataa>什么是CoreDatab>CoreData增删改查 "什么时候使用COredata 什么时候使用FMDatabases"CoreData 在 ...
- iOS CoreData技术学习资源汇总
一.CoreData学习指引 1. 苹果官方:Core Data Programming Guide 什么是CoreData? 创建托管对象模型 初始化Core Data堆栈 提取对象 创建和修改自定 ...
随机推荐
- ASP.NET WebAPI 02-Action的选择(一)
在WebAPI对于Action的选择主要经过:Action方法名匹配,Http方法匹配,参数匹配三步. Http方法匹配 WebAPI提供了三种Http方法的选择方式,分别是:方法前缀,AcceptV ...
- Node.js 的异步机制由事件和回调函数——循环中的回调函数
var fs=require('fs'); var files =['a.txt','b.txt','c.txt']; // for (var i = 0; i < files.length; ...
- 深度学习笔记之【随机梯度下降(SGD)】
随机梯度下降 几乎所有的深度学习算法都用到了一个非常重要的算法:随机梯度下降(stochastic gradient descent,SGD) 随机梯度下降是梯度下降算法的一个扩展 机器学习中一个反复 ...
- jQuery before 和 after
A.after(B) ==== B.insertAfter(A) B 放在 A 的后面A.before(B) ==== B.insertBefore(A) B 放在 A 的前面 A.append(B) ...
- Redis学习篇(七)之事务
Redis中的事务 开启事务 MULTI:开启事务,事务块中多条语句会按照顺序放入队列当中,最后由EXEC来执行 MULTI INCT counter1 INCR counter2 INCR coun ...
- [BZOJ4651][NOI2016]网格(Tarjan)
下面直接给出结论,相关证明见官方题解. 1.若跳蚤数不超过1或仅有两只跳蚤且相邻,则答案为-1. 2.若跳蚤形成的连通块个数大于1,则答案为0. 3.若跳蚤之间建图存在割点,则答案为1. 4.否则为2 ...
- hdu 3294 manacher 求回文串
感谢: http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/ O(n)求给定字符串的以每个位置为中心的回文串长度. 中心思想:每次计算位 ...
- Educational Codeforces Round 11 B. Seating On Bus 水题
B. Seating On Bus 题目连接: http://www.codeforces.com/contest/660/problem/B Description Consider 2n rows ...
- HDU 5653 Bomber Man wants to bomb an Array. dp
Bomber Man wants to bomb an Array. 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5653 Description ...
- uoj 41 【清华集训2014】矩阵变换 婚姻稳定问题
[清华集训2014]矩阵变换 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/41 Description 给出 ...