再次回归博客园, 已经实属不易了, 面临这近期忙忙碌碌的项目开发, 虽然并不是完全的没有闲暇时间, 但是怎么说呢, 也有着各种的无奈与曲折, 面临这产品需求的不断变化和页面的不断更新, 对于一个程序员的我而讲, 这个已经是最大的挑战了, 也是第一次面临这样的事情,  需求在没有定下来的情况下, 就开始匆忙的着手项目开发, 不过现在还好啦, 总算是停下手来, 开始有点空闲时间了, 接下来我就给大笨蛋简单说下, 我这一两天所学习的东东吧.

    一.CoreData项目的创建

    首先打开Xcode然后跟创建普通工程以后, 不过这里有一点不同了, 下面用图片来说明

    那么这个CoreData工程就创建完成了, 接下来我们会看到工程和往常的不一样之处, 就是多了一个文件, 那便是CoreData的独到之处了:

    想必大家都看到了吧,  那么肯定你们会问这个到底有什么用处呢其实他就是来生成实体的.

    二.如何生成实体

    首先我们打开该文件, 我们会看到如下界面

    上面标出的分别是添加实体(Add Entity), 创建好的实体, 和添加属性(Add Attribute), 实体间的关系(Relationships), 这样都生成完成后, 我们点击Xcode菜单栏上的Editor按钮会弹出窗口, 具体操作如下:

    接下来就是具体的编码过程了, 那么接下来我就以图书管理系统来给大家讲解下具体要怎么用吧:

    (1)首先需要创建四个视图控制器, 分别为作者控制器, 添加作者控制器, 作者对应书籍控制器, 添加书籍的控制器

    (2)其次是要对视图中跳转逻辑处理清楚

    (3)下面便是做成的最终展示效果

    

    这就是最终效果, 界面其实并不是那么的炫, 只是实现了简单的持久化增加删除操作, 嘿嘿, 相比也有友友对这些是不太了解的吧. 首先呢我们需要在做着控制器里面导入头文件:

    然后创建tableview, 和常规一样, 接下俩自定义cell创建btn等, 自定义适合自己的完美布局.

    接下来在didload里面我们要获取程序的委托对象

  1. //获取当前程序的委托对象
  2. self.appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

    在视图将要出现的地方我们要做一下操作(1)创建抓取对象的请求对象(2)设置抓取哪种对象的实体(3)设置开始抓取实体

(4)执行抓取对象的请求, 返回符合条件的实体

    具体代码如下所示:

  1. - (void)viewWillAppear:(BOOL)animated{
  2. [super viewWillAppear:animated];
  3. //创建抓取对象的请求对象
  4. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  5. //设置抓取哪种类型的实体
  6. NSEntityDescription *description = [NSEntityDescription entityForName:@"BHAuthor" inManagedObjectContext:self.appDelegate.managedObjectContext];
  7. //设置抓取实体
  8. [request setEntity:description];
  9. NSError *error = nil;
  10. //执行抓取数据的请求, 返回符合条件的数据
  11. self.authorArray = [[self.appDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
  12. if (_authorArray == nil) {
  13. NSLog(@"获取实体出错 %@, %@", error, [error userInfo]);
  14. }
  15.  
  16. [_tableView reloadData];
  17. }

    紧接着就是添加作者和删除的操作了, 由于删除操作不需要跳转控制器, 所以我们先来说下删除操作, 他只是利用tableViewDataSource代理中的方法来执行的, 所以我们要做的就只是在点击删除按钮时, 打开编辑选项:

  1. - (void)deleteAuthor{
  2. [self.tableView setEditing:!self.tableView.editing animated:YES];
  3. // if (self.tableView.editing) {
  4. // self.tableView.
  5. // }
  6. }

    然后我们来执行代理方法:

  1. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
  2. //如果正处于提交删除操作
  3. if (editingStyle == UITableViewCellEditingStyleDelete) {
  4. NSInteger integer = indexPath.row;
  5. BHAuthor *author = [_authorArray objectAtIndex:integer];
  6. [self.appDelegate.managedObjectContext deleteObject:author];
  7. NSError *error = nil;
  8. if (![self.appDelegate.managedObjectContext save:&error]) {
  9. NSLog(@"错误信息");
  10. }
  11. [_authorArray removeObject:author];
  12. [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
  13. }
  14. }

    这就是完整的删除操作了, 看着其实并不是那么难, 但是需要注意的是再删除时间一定要删除cell和数据源, 否则会造成程序崩溃的.

    下面来说下添加的方法, 首先我们应该要进行跳转, 然后在导航栏上创建右侧添加按钮进行关联方法, 具体方法如下

  1. - (void)addAuthor{
  2. NSString *authorName = _authorField.text;
  3. NSString *authorDes = _authorDesTextField.text;
  4. if (authorDes.length > && authorName.length > ) {
  5. BHAuthor *ahthor = [NSEntityDescription insertNewObjectForEntityForName:@"BHAuthor" inManagedObjectContext:self.appDelegate.managedObjectContext];
  6. ahthor.name = authorName;
  7. ahthor.authorDes = authorDes;
  8.  
  9. NSError *error = nil;
  10. if ([self.appDelegate.managedObjectContext save:&error]) {
  11. UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"恭喜" delegate:nil cancelButtonTitle:@"好的" destructiveButtonTitle:nil otherButtonTitles:nil];
  12. [actionSheet showInView:self.view];
  13. [self dismissViewControllerAnimated:YES completion:nil];
  14. }
  15. }
  16. }

    首先我们要判断的是作者和作者简介输入框字符不能为空, 否则不能进行添加操作, 如果不为空的话, 那么我们要控制CoreData在托管对象上下文中创建一个新实体, 然后对新实体的属性进行赋值, 对其属性赋值完成后, 我们要调用托管对象的上下文的save方法进行写入数据库操作, 同时我还定义了NSError对象来输出保存错误的信息. 这样我们就很快的完成了添加删除操作了, 整体来说都是要先获取当前程序的委托对象, 然后进行创建请求(或者创建实体), 对数据库进行操作等, 对于图书的添加和删除的方法也是类似与作者的添加和删除, 唯一有所不同的就是, 我们要先把作者给传到下个控制器, 以便获取到的是同一作者的图书, 在这里我用的代理方法, 首先定义代理:

  1. #import <UIKit/UIKit.h>
  2. #import "BHAuthor.h"
  3.  
  4. #define WIDTH [UIScreen mainScreen].bounds.size.width
  5.  
  6. @protocol infoBtnDelegate <NSObject>
  7.  
  8. - (void)skipToBooks:(BHAuthor *)authorName;
  9.  
  10. @end

    然后在要跳转的地方实现代理:

  1. - (void)skipToBooks:(BHAuthor *)authorName{
  2. BHBooksViewController *books = [[BHBooksViewController alloc] init];
  3. books.authorName = authorName;
  4. [self.navigationController pushViewController:books animated:YES];
  5. }

    在抓取图书的地方唯一多的就是, 多了一个过滤器 也就是设置抓取条件:

  1. - (void)viewWillAppear:(BOOL)animated{
  2. [super viewWillAppear:animated];
  3.  
  4. //创建抓取对象的请求对象
  5. NSFetchRequest *request = [[NSFetchRequest alloc] init];
  6. //创建要抓取哪种对象的实体
  7. NSEntityDescription *entity = [NSEntityDescription entityForName:@"BHBooks" inManagedObjectContext:_appDelegate.managedObjectContext];
  8. //设置抓取实体
  9. [request setEntity:entity];
  10. //定义抓取条件, 之抓取当前作者的图书
  11. request.predicate = [NSPredicate predicateWithFormat:@"author = %@", _authorName];
  12. NSError *error = nil;
  13. //执行抓取数据的操作, 返回数组
  14. _booksAry = [[_appDelegate.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
  15. if (_booksAry == nil) {
  16. NSLog(@"出错了");
  17. } else {
  18. [_tableView reloadData];
  19. }
  20.  
  21. }

    这样就实现了抓取单一作者相对应的图书了, 简单吧, 哈哈 今天就写到这里了, 等有时间了继续来园子里分享知识哦, 与盆友们共同进步喽, 加油加油, 哈哈, 不知不觉就要下班喽, 明天要休息啦, 朋友们都有一个愉快的周末哈, 拜拜!

数据持久化之CoreData的更多相关文章

  1. iOS -数据持久化之CoreData

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

  2. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  3. ios数据持久化--CoreData框架的介绍和使用

    1.Core Data 是数据持久化存储的最佳方式 2.数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型 在Mac OS X 10.5Leopard及以后的版本中 ...

  4. [Xcode 实际操作]七、文件与数据-(14)数据持久化存储框架CoreData的使用:删除CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何删除数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  5. [Xcode 实际操作]七、文件与数据-(13)数据持久化存储框架CoreData的使用:编辑CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何修改数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  6. [Xcode 实际操作]七、文件与数据-(12)数据持久化存储框架CoreData的使用:查找CoreData中的数据

    目录:[Swift]Xcode实际操作 本文将演示如何查找数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入数据持 ...

  7. [Xcode 实际操作]七、文件与数据-(11)数据持久化存储框架CoreData的使用:创建CoreData实体并插入数据

    目录:[Swift]Xcode实际操作 本文将演示[CoreData]数据持久化存储框架的使用. 点击[Create a new Xcode project]创建一个新的项目 ->[Single ...

  8. IOS数据存储之CoreData使用优缺点

    前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据库的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数 ...

  9. iOS之数据持久化方案

    概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) ...

随机推荐

  1. PHP输出中文乱码的问题(转)

    用echo输出的中文显示成乱码, 其实应该是各种服务器脚本都会遇到这个问题, 根本还是编码问题, 一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8 <meta http-equi ...

  2. XFire构建服务端Service的两种方式

    1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...

  3. (四)Angularjs - 小实例(2)

    自定义指令编写时钟 模板 <!-- 模板文件 --><html> <!-- 内置的ng-app指令通知编译器启动AngularJS框架--> <body ng ...

  4. IO流(File类

    File类 三个构造方法 File(String filename)//模式和应用程序一个目录下 File(String directoryPath,String filename)//文件的绝对路径 ...

  5. hdu2112(HDU Today 简单最短路)

    Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...

  6. MYSQL id 自动加1

    个人心得 建立好表以后再进行修改总是容易出错 建议用sql语句进行创建表,定义相应的属性 CREATE TABLE USER( Id INTEGER PRIMARY KEY AUTO_INCREMEN ...

  7. jQuery的remove和detach的区别

    1.remove([expr])   概述:从DOM中删除所有匹配的元素. 这个方法不会把匹配的元素从jQuery对象中删除,因而可以在将来再使用这些匹配的元素.但除了这个元素本身得以保留之外,其他的 ...

  8. IE的有条件注释详解

    IE的有条件注释是一种专有的(因此是非标准的).对常规(X)HTML注释的Miscrosoft扩展.顾名思义,有条件注释使你能够根据条件(比如浏览器版本)显示代码块.尽管是非标准的,但是有条件注释对于 ...

  9. postgres安装 以及修改postgres 密码

    #postgres安装 apt-get install postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3 postgresql-s ...

  10. 用dup2和dup产生一份file descriptor 的拷贝

    在类Unix操作系统里面,.dup2和dup都通过系统调用来产生一份file descriptor 的拷贝.   dup对我来说还很简单   int dup(int filedes);   dup2就 ...