• 数据持久化之CoreData


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

        一.CoreData项目的创建

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

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

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

        二.如何生成实体

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

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

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

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

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

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

        

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

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

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

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

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

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

        具体代码如下所示:

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

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

    - (void)deleteAuthor{
        [self.tableView setEditing:!self.tableView.editing animated:YES];
    //    if (self.tableView.editing) {
    //        self.tableView.
    //    }
    }

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

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

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

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

    - (void)addAuthor{
        NSString *authorName = _authorField.text;
        NSString *authorDes = _authorDesTextField.text;
        if (authorDes.length > 0 && authorName.length > 0) {
            BHAuthor *ahthor = [NSEntityDescription insertNewObjectForEntityForName:@"BHAuthor" inManagedObjectContext:self.appDelegate.managedObjectContext];
            ahthor.name = authorName;
            ahthor.authorDes = authorDes;
            
            NSError *error = nil;
            if ([self.appDelegate.managedObjectContext save:&error]) {
                UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"恭喜" delegate:nil cancelButtonTitle:@"好的" destructiveButtonTitle:nil otherButtonTitles:nil];
                [actionSheet showInView:self.view];
                [self dismissViewControllerAnimated:YES completion:nil];
            }
        }
    }

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

    #import <UIKit/UIKit.h>
    #import "BHAuthor.h"
    
    #define WIDTH [UIScreen mainScreen].bounds.size.width
    
    @protocol infoBtnDelegate <NSObject>
    
    - (void)skipToBooks:(BHAuthor *)authorName;
    
    @end

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

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

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

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

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

  • 相关阅读:
    linux mysql添加用户
    linux mysql为root用户初始化密码和改变root密码
    linux pts/0的含义
    mysql查看表的结构
    linux踢人命令 pkill踢人用法
    linux查看在线用户 who命令参数及用法
    linux mysql数据库安装(tar.gz)
    vue app外卖(5) 使用swiper 进行图片轮播
    element-UI 点击一行,背景色变化
    vue 外卖app(3) 利用slot分发内容
  • 原文地址:https://www.cnblogs.com/dyx-wx/p/4905306.html
Copyright © 2020-2023  润新知