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

最新文章

  1. A chatroom for all! Part 1 - Introduction to Node.js(转发)
  2. push方法的兼容性问题
  3. MySQL学习笔记02_数据库和表的基本操作
  4. Main 程序的入口要做哪些事情
  5. 使用__slots__限定实例的成员列表
  6. 【转】eclipse集成开发工具的插件安装
  7. 李洪强iOS开发之UICollectionView的使用
  8. CodeForces 709C Letters Cyclic Shift (水题)
  9. leetcode修炼之路——83. Remove Duplicates from Sorted List
  10. Walls POJ 1161
  11. 第二十次codeforces竞技结束 #276 Div 2
  12. 首次启动优美新手指引tip
  13. java实现——007用两个栈实现队列
  14. Submin1安装记录(CentOS5)
  15. maven的安装配置以及在IDEA中配置
  16. 利用Express和ejs编写简单页面
  17. Java实现月份递减
  18. struts2多文件上传-2
  19. 车轮升级PHP7踩过的一些坑
  20. python之实现ftp上传下载代码(含错误处理)

热门文章

  1. [实战]MVC5+EF6+MySql企业网盘实战(9)——编辑文件名
  2. loadrunner脚本编写http协议
  3. VMware虚拟机VMware Authorization Service不能启动问题
  4. css特效-一道闪光在图片上划过
  5. 面试的65个回答技巧-适用于BAT公司
  6. ref:mysql丢失密码,如何修改?
  7. 【转载】retrofit 2 源码解析
  8. SCU 4442 Party
  9. xss可用事件
  10. 初始Hibernate4